// Copyright 2021 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.26.0
// 	protoc        v3.12.2
// source: google/api/routing.proto

package annotations

import (
	reflect "reflect"
	sync "sync"

	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	descriptorpb "google.golang.org/protobuf/types/descriptorpb"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Specifies the routing information that should be sent along with the request
// in the form of routing header.
// **NOTE:** All service configuration rules follow the "last one wins" order.
//
// The examples below will apply to an RPC which has the following request type:
//
// Message Definition:
//
//     message Request {
//       // The name of the Table
//       // Values can be of the following formats:
//       // - `projects/<project>/tables/<table>`
//       // - `projects/<project>/instances/<instance>/tables/<table>`
//       // - `region/<region>/zones/<zone>/tables/<table>`
//       string table_name = 1;
//
//       // This value specifies routing for replication.
//       // It can be in the following formats:
//       // - `profiles/<profile_id>`
//       // - a legacy `profile_id` that can be any string
//       string app_profile_id = 2;
//     }
//
// Example message:
//
//     {
//       table_name: projects/proj_foo/instances/instance_bar/table/table_baz,
//       app_profile_id: profiles/prof_qux
//     }
//
// The routing header consists of one or multiple key-value pairs. Every key
// and value must be percent-encoded, and joined together in the format of
// `key1=value1&key2=value2`.
// In the examples below I am skipping the percent-encoding for readablity.
//
// Example 1
//
// Extracting a field from the request to put into the routing header
// unchanged, with the key equal to the field name.
//
// annotation:
//
//     option (google.api.routing) = {
//       // Take the `app_profile_id`.
//       routing_parameters {
//         field: "app_profile_id"
//       }
//     };
//
// result:
//
//     x-goog-request-params: app_profile_id=profiles/prof_qux
//
// Example 2
//
// Extracting a field from the request to put into the routing header
// unchanged, with the key different from the field name.
//
// annotation:
//
//     option (google.api.routing) = {
//       // Take the `app_profile_id`, but name it `routing_id` in the header.
//       routing_parameters {
//         field: "app_profile_id"
//         path_template: "{routing_id=**}"
//       }
//     };
//
// result:
//
//     x-goog-request-params: routing_id=profiles/prof_qux
//
// Example 3
//
// Extracting a field from the request to put into the routing
// header, while matching a path template syntax on the field's value.
//
// NB: it is more useful to send nothing than to send garbage for the purpose
// of dynamic routing, since garbage pollutes cache. Thus the matching.
//
// Sub-example 3a
//
// The field matches the template.
//
// annotation:
//
//     option (google.api.routing) = {
//       // Take the `table_name`, if it's well-formed (with project-based
//       // syntax).
//       routing_parameters {
//         field: "table_name"
//         path_template: "{table_name=projects/*/instances/*/**}"
//       }
//     };
//
// result:
//
//     x-goog-request-params:
//     table_name=projects/proj_foo/instances/instance_bar/table/table_baz
//
// Sub-example 3b
//
// The field does not match the template.
//
// annotation:
//
//     option (google.api.routing) = {
//       // Take the `table_name`, if it's well-formed (with region-based
//       // syntax).
//       routing_parameters {
//         field: "table_name"
//         path_template: "{table_name=regions/*/zones/*/**}"
//       }
//     };
//
// result:
//
//     <no routing header will be sent>
//
// Sub-example 3c
//
// Multiple alternative conflictingly named path templates are
// specified. The one that matches is used to construct the header.
//
// annotation:
//
//     option (google.api.routing) = {
//       // Take the `table_name`, if it's well-formed, whether
//       // using the region- or projects-based syntax.
//
//       routing_parameters {
//         field: "table_name"
//         path_template: "{table_name=regions/*/zones/*/**}"
//       }
//       routing_parameters {
//         field: "table_name"
//         path_template: "{table_name=projects/*/instances/*/**}"
//       }
//     };
//
// result:
//
//     x-goog-request-params:
//     table_name=projects/proj_foo/instances/instance_bar/table/table_baz
//
// Example 4
//
// Extracting a single routing header key-value pair by matching a
// template syntax on (a part of) a single request field.
//
// annotation:
//
//     option (google.api.routing) = {
//       // Take just the project id from the `table_name` field.
//       routing_parameters {
//         field: "table_name"
//         path_template: "{routing_id=projects/*}/**"
//       }
//     };
//
// result:
//
//     x-goog-request-params: routing_id=projects/proj_foo
//
// Example 5
//
// Extracting a single routing header key-value pair by matching
// several conflictingly named path templates on (parts of) a single request
// field. The last template to match "wins" the conflict.
//
// annotation:
//
//     option (google.api.routing) = {
//       // If the `table_name` does not have instances information,
//       // take just the project id for routing.
//       // Otherwise take project + instance.
//
//       routing_parameters {
//         field: "table_name"
//         path_template: "{routing_id=projects/*}/**"
//       }
//       routing_parameters {
//         field: "table_name"
//         path_template: "{routing_id=projects/*/instances/*}/**"
//       }
//     };
//
// result:
//
//     x-goog-request-params:
//     routing_id=projects/proj_foo/instances/instance_bar
//
// Example 6
//
// Extracting multiple routing header key-value pairs by matching
// several non-conflicting path templates on (parts of) a single request field.
//
// Sub-example 6a
//
// Make the templates strict, so that if the `table_name` does not
// have an instance information, nothing is sent.
//
// annotation:
//
//     option (google.api.routing) = {
//       // The routing code needs two keys instead of one composite
//       // but works only for the tables with the "project-instance" name
//       // syntax.
//
//       routing_parameters {
//         field: "table_name"
//         path_template: "{project_id=projects/*}/instances/*/**"
//       }
//       routing_parameters {
//         field: "table_name"
//         path_template: "projects/*/{instance_id=instances/*}/**"
//       }
//     };
//
// result:
//
//     x-goog-request-params:
//     project_id=projects/proj_foo&instance_id=instances/instance_bar
//
// Sub-example 6b
//
// Make the templates loose, so that if the `table_name` does not
// have an instance information, just the project id part is sent.
//
// annotation:
//
//     option (google.api.routing) = {
//       // The routing code wants two keys instead of one composite
//       // but will work with just the `project_id` for tables without
//       // an instance in the `table_name`.
//
//       routing_parameters {
//         field: "table_name"
//         path_template: "{project_id=projects/*}/**"
//       }
//       routing_parameters {
//         field: "table_name"
//         path_template: "projects/*/{instance_id=instances/*}/**"
//       }
//     };
//
// result (is the same as 6a for our example message because it has the instance
// information):
//
//     x-goog-request-params:
//     project_id=projects/proj_foo&instance_id=instances/instance_bar
//
// Example 7
//
// Extracting multiple routing header key-value pairs by matching
// several path templates on multiple request fields.
//
// NB: note that here there is no way to specify sending nothing if one of the
// fields does not match its template. E.g. if the `table_name` is in the wrong
// format, the `project_id` will not be sent, but the `routing_id` will be.
// The backend routing code has to be aware of that and be prepared to not
// receive a full complement of keys if it expects multiple.
//
// annotation:
//
//     option (google.api.routing) = {
//       // The routing needs both `project_id` and `routing_id`
//       // (from the `app_profile_id` field) for routing.
//
//       routing_parameters {
//         field: "table_name"
//         path_template: "{project_id=projects/*}/**"
//       }
//       routing_parameters {
//         field: "app_profile_id"
//         path_template: "{routing_id=**}"
//       }
//     };
//
// result:
//
//     x-goog-request-params:
//     project_id=projects/proj_foo&routing_id=profiles/prof_qux
//
// Example 8
//
// Extracting a single routing header key-value pair by matching
// several conflictingly named path templates on several request fields. The
// last template to match "wins" the conflict.
//
// annotation:
//
//     option (google.api.routing) = {
//       // The `routing_id` can be a project id or a region id depending on
//       // the table name format, but only if the `app_profile_id` is not set.
//       // If `app_profile_id` is set it should be used instead.
//
//       routing_parameters {
//         field: "table_name"
//         path_template: "{routing_id=projects/*}/**"
//       }
//       routing_parameters {
//          field: "table_name"
//          path_template: "{routing_id=regions/*}/**"
//       }
//       routing_parameters {
//         field: "app_profile_id"
//         path_template: "{routing_id=**}"
//       }
//     };
//
// result:
//
//     x-goog-request-params: routing_id=profiles/prof_qux
//
// Example 9
//
// Bringing it all together.
//
// annotation:
//
//     option (google.api.routing) = {
//       // For routing both `table_location` and a `routing_id` are needed.
//       //
//       // table_location can be either an instance id or a region+zone id.
//       //
//       // For `routing_id`, take the value of `app_profile_id`
//       // - If it's in the format `profiles/<profile_id>`, send
//       // just the `<profile_id>` part.
//       // - If it's any other literal, send it as is.
//       // If the `app_profile_id` is empty, and the `table_name` starts with
//       // the project_id, send that instead.
//
//       routing_parameters {
//         field: "table_name"
//         path_template: "projects/*/{table_location=instances/*}/tables/*"
//       }
//       routing_parameters {
//         field: "table_name"
//         path_template: "{table_location=regions/*/zones/*}/tables/*"
//       }
//       routing_parameters {
//         field: "table_name"
//         path_template: "{routing_id=projects/*}/**"
//       }
//       routing_parameters {
//         field: "app_profile_id"
//         path_template: "{routing_id=**}"
//       }
//       routing_parameters {
//         field: "app_profile_id"
//         path_template: "profiles/{routing_id=*}"
//       }
//     };
//
// result:
//
//     x-goog-request-params:
//     table_location=instances/instance_bar&routing_id=prof_qux
type RoutingRule struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A collection of Routing Parameter specifications.
	// **NOTE:** If multiple Routing Parameters describe the same key
	// (via the `path_template` field or via the `field` field when
	// `path_template` is not provided), "last one wins" rule
	// determines which Parameter gets used.
	// See the examples for more details.
	RoutingParameters []*RoutingParameter `protobuf:"bytes,2,rep,name=routing_parameters,json=routingParameters,proto3" json:"routing_parameters,omitempty"`
}

func (x *RoutingRule) Reset() {
	*x = RoutingRule{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_api_routing_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *RoutingRule) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RoutingRule) ProtoMessage() {}

func (x *RoutingRule) ProtoReflect() protoreflect.Message {
	mi := &file_google_api_routing_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RoutingRule.ProtoReflect.Descriptor instead.
func (*RoutingRule) Descriptor() ([]byte, []int) {
	return file_google_api_routing_proto_rawDescGZIP(), []int{0}
}

func (x *RoutingRule) GetRoutingParameters() []*RoutingParameter {
	if x != nil {
		return x.RoutingParameters
	}
	return nil
}

// A projection from an input message to the GRPC or REST header.
type RoutingParameter struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A request field to extract the header key-value pair from.
	Field string `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	// A pattern matching the key-value field. Optional.
	// If not specified, the whole field specified in the `field` field will be
	// taken as value, and its name used as key. If specified, it MUST contain
	// exactly one named segment (along with any number of unnamed segments) The
	// pattern will be matched over the field specified in the `field` field, then
	// if the match is successful:
	// - the name of the single named segment will be used as a header name,
	// - the match value of the segment will be used as a header value;
	// if the match is NOT successful, nothing will be sent.
	//
	// Example:
	//
	//               -- This is a field in the request message
	//              |   that the header value will be extracted from.
	//              |
	//              |                     -- This is the key name in the
	//              |                    |   routing header.
	//              V                    |
	//     field: "table_name"           v
	//     path_template: "projects/*/{table_location=instances/*}/tables/*"
	//                                                ^            ^
	//                                                |            |
	//       In the {} brackets is the pattern that --             |
	//       specifies what to extract from the                    |
	//       field as a value to be sent.                          |
	//                                                             |
	//      The string in the field must match the whole pattern --
	//      before brackets, inside brackets, after brackets.
	//
	// When looking at this specific example, we can see that:
	// - A key-value pair with the key `table_location`
	//   and the value matching `instances/*` should be added
	//   to the x-goog-request-params routing header.
	// - The value is extracted from the request message's `table_name` field
	//   if it matches the full pattern specified:
	//   `projects/*/instances/*/tables/*`.
	//
	// **NB:** If the `path_template` field is not provided, the key name is
	// equal to the field name, and the whole field should be sent as a value.
	// This makes the pattern for the field and the value functionally equivalent
	// to `**`, and the configuration
	//
	//     {
	//       field: "table_name"
	//     }
	//
	// is a functionally equivalent shorthand to:
	//
	//     {
	//       field: "table_name"
	//       path_template: "{table_name=**}"
	//     }
	//
	// See Example 1 for more details.
	PathTemplate string `protobuf:"bytes,2,opt,name=path_template,json=pathTemplate,proto3" json:"path_template,omitempty"`
}

func (x *RoutingParameter) Reset() {
	*x = RoutingParameter{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_api_routing_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *RoutingParameter) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*RoutingParameter) ProtoMessage() {}

func (x *RoutingParameter) ProtoReflect() protoreflect.Message {
	mi := &file_google_api_routing_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use RoutingParameter.ProtoReflect.Descriptor instead.
func (*RoutingParameter) Descriptor() ([]byte, []int) {
	return file_google_api_routing_proto_rawDescGZIP(), []int{1}
}

func (x *RoutingParameter) GetField() string {
	if x != nil {
		return x.Field
	}
	return ""
}

func (x *RoutingParameter) GetPathTemplate() string {
	if x != nil {
		return x.PathTemplate
	}
	return ""
}

var file_google_api_routing_proto_extTypes = []protoimpl.ExtensionInfo{
	{
		ExtendedType:  (*descriptorpb.MethodOptions)(nil),
		ExtensionType: (*RoutingRule)(nil),
		Field:         72295729,
		Name:          "google.api.routing",
		Tag:           "bytes,72295729,opt,name=routing",
		Filename:      "google/api/routing.proto",
	},
}

// Extension fields to descriptorpb.MethodOptions.
var (
	// See RoutingRule.
	//
	// optional google.api.RoutingRule routing = 72295729;
	E_Routing = &file_google_api_routing_proto_extTypes[0]
)

var File_google_api_routing_proto protoreflect.FileDescriptor

var file_google_api_routing_proto_rawDesc = []byte{
	0x0a, 0x18, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x72, 0x6f, 0x75,
	0x74, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
	0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5a, 0x0a, 0x0b, 0x52, 0x6f, 0x75, 0x74,
	0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x12, 0x72, 0x6f, 0x75, 0x74, 0x69,
	0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
	0x72, 0x52, 0x11, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65,
	0x74, 0x65, 0x72, 0x73, 0x22, 0x4d, 0x0a, 0x10, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x50,
	0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c,
	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x23,
	0x0a, 0x0d, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x61, 0x74, 0x68, 0x54, 0x65, 0x6d, 0x70, 0x6c,
	0x61, 0x74, 0x65, 0x3a, 0x54, 0x0a, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1e,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
	0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xb1,
	0xca, 0xbc, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65,
	0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x6a, 0x0a, 0x0e, 0x63, 0x6f, 0x6d,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0c, 0x52, 0x6f, 0x75,
	0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x41, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67,
	0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70,
	0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x3b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa2, 0x02,
	0x04, 0x47, 0x41, 0x50, 0x49, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_api_routing_proto_rawDescOnce sync.Once
	file_google_api_routing_proto_rawDescData = file_google_api_routing_proto_rawDesc
)

func file_google_api_routing_proto_rawDescGZIP() []byte {
	file_google_api_routing_proto_rawDescOnce.Do(func() {
		file_google_api_routing_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_api_routing_proto_rawDescData)
	})
	return file_google_api_routing_proto_rawDescData
}

var file_google_api_routing_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_google_api_routing_proto_goTypes = []interface{}{
	(*RoutingRule)(nil),                // 0: google.api.RoutingRule
	(*RoutingParameter)(nil),           // 1: google.api.RoutingParameter
	(*descriptorpb.MethodOptions)(nil), // 2: google.protobuf.MethodOptions
}
var file_google_api_routing_proto_depIdxs = []int32{
	1, // 0: google.api.RoutingRule.routing_parameters:type_name -> google.api.RoutingParameter
	2, // 1: google.api.routing:extendee -> google.protobuf.MethodOptions
	0, // 2: google.api.routing:type_name -> google.api.RoutingRule
	3, // [3:3] is the sub-list for method output_type
	3, // [3:3] is the sub-list for method input_type
	2, // [2:3] is the sub-list for extension type_name
	1, // [1:2] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_google_api_routing_proto_init() }
func file_google_api_routing_proto_init() {
	if File_google_api_routing_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_api_routing_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RoutingRule); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_api_routing_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RoutingParameter); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_api_routing_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 1,
			NumServices:   0,
		},
		GoTypes:           file_google_api_routing_proto_goTypes,
		DependencyIndexes: file_google_api_routing_proto_depIdxs,
		MessageInfos:      file_google_api_routing_proto_msgTypes,
		ExtensionInfos:    file_google_api_routing_proto_extTypes,
	}.Build()
	File_google_api_routing_proto = out.File
	file_google_api_routing_proto_rawDesc = nil
	file_google_api_routing_proto_goTypes = nil
	file_google_api_routing_proto_depIdxs = nil
}
