#![allow(unknown_lints)]
#![allow(clippy::all)]
#![allow(unused_attributes)]
#![cfg_attr(rustfmt, rustfmt::skip)]
#![allow(box_pointers)]
#![allow(dead_code)]
#![allow(missing_docs)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(non_upper_case_globals)]
#![allow(trivial_casts)]
#![allow(unused_imports)]
#![allow(unused_results)]
#[derive(PartialEq,Clone,Default)]
pub struct RoutingRule {
pub routing_parameters: ::protobuf::RepeatedField<RoutingParameter>,
pub unknown_fields: ::protobuf::UnknownFields,
pub cached_size: ::protobuf::CachedSize,
}
impl<'a> ::std::default::Default for &'a RoutingRule {
fn default() -> &'a RoutingRule {
<RoutingRule as ::protobuf::Message>::default_instance()
}
}
impl RoutingRule {
pub fn new() -> RoutingRule {
::std::default::Default::default()
}
pub fn get_routing_parameters(&self) -> &[RoutingParameter] {
&self.routing_parameters
}
pub fn clear_routing_parameters(&mut self) {
self.routing_parameters.clear();
}
pub fn set_routing_parameters(&mut self, v: ::protobuf::RepeatedField<RoutingParameter>) {
self.routing_parameters = v;
}
pub fn mut_routing_parameters(&mut self) -> &mut ::protobuf::RepeatedField<RoutingParameter> {
&mut self.routing_parameters
}
pub fn take_routing_parameters(&mut self) -> ::protobuf::RepeatedField<RoutingParameter> {
::std::mem::replace(&mut self.routing_parameters, ::protobuf::RepeatedField::new())
}
}
impl ::protobuf::Message for RoutingRule {
fn is_initialized(&self) -> bool {
for v in &self.routing_parameters {
if !v.is_initialized() {
return false;
}
};
true
}
fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
while !is.eof()? {
let (field_number, wire_type) = is.read_tag_unpack()?;
match field_number {
2 => {
::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.routing_parameters)?;
},
_ => {
::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
},
};
}
::std::result::Result::Ok(())
}
#[allow(unused_variables)]
fn compute_size(&self) -> u32 {
let mut my_size = 0;
for value in &self.routing_parameters {
let len = value.compute_size();
my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
};
my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
self.cached_size.set(my_size);
my_size
}
fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
for v in &self.routing_parameters {
os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?;
os.write_raw_varint32(v.get_cached_size())?;
v.write_to_with_cached_sizes(os)?;
};
os.write_unknown_fields(self.get_unknown_fields())?;
::std::result::Result::Ok(())
}
fn get_cached_size(&self) -> u32 {
self.cached_size.get()
}
fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
&self.unknown_fields
}
fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
&mut self.unknown_fields
}
fn as_any(&self) -> &dyn (::std::any::Any) {
self as &dyn (::std::any::Any)
}
fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
self as &mut dyn (::std::any::Any)
}
fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
self
}
fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
Self::descriptor_static()
}
fn new() -> RoutingRule {
RoutingRule::new()
}
fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
descriptor.get(|| {
let mut fields = ::std::vec::Vec::new();
fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<RoutingParameter>>(
"routing_parameters",
|m: &RoutingRule| { &m.routing_parameters },
|m: &mut RoutingRule| { &mut m.routing_parameters },
));
::protobuf::reflect::MessageDescriptor::new_pb_name::<RoutingRule>(
"RoutingRule",
fields,
file_descriptor_proto()
)
})
}
fn default_instance() -> &'static RoutingRule {
static instance: ::protobuf::rt::LazyV2<RoutingRule> = ::protobuf::rt::LazyV2::INIT;
instance.get(RoutingRule::new)
}
}
impl ::protobuf::Clear for RoutingRule {
fn clear(&mut self) {
self.routing_parameters.clear();
self.unknown_fields.clear();
}
}
impl ::std::fmt::Debug for RoutingRule {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
::protobuf::text_format::fmt(self, f)
}
}
impl ::protobuf::reflect::ProtobufValue for RoutingRule {
fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
::protobuf::reflect::ReflectValueRef::Message(self)
}
}
#[derive(PartialEq,Clone,Default)]
pub struct RoutingParameter {
pub field: ::std::string::String,
pub path_template: ::std::string::String,
pub unknown_fields: ::protobuf::UnknownFields,
pub cached_size: ::protobuf::CachedSize,
}
impl<'a> ::std::default::Default for &'a RoutingParameter {
fn default() -> &'a RoutingParameter {
<RoutingParameter as ::protobuf::Message>::default_instance()
}
}
impl RoutingParameter {
pub fn new() -> RoutingParameter {
::std::default::Default::default()
}
pub fn get_field(&self) -> &str {
&self.field
}
pub fn clear_field(&mut self) {
self.field.clear();
}
pub fn set_field(&mut self, v: ::std::string::String) {
self.field = v;
}
pub fn mut_field(&mut self) -> &mut ::std::string::String {
&mut self.field
}
pub fn take_field(&mut self) -> ::std::string::String {
::std::mem::replace(&mut self.field, ::std::string::String::new())
}
pub fn get_path_template(&self) -> &str {
&self.path_template
}
pub fn clear_path_template(&mut self) {
self.path_template.clear();
}
pub fn set_path_template(&mut self, v: ::std::string::String) {
self.path_template = v;
}
pub fn mut_path_template(&mut self) -> &mut ::std::string::String {
&mut self.path_template
}
pub fn take_path_template(&mut self) -> ::std::string::String {
::std::mem::replace(&mut self.path_template, ::std::string::String::new())
}
}
impl ::protobuf::Message for RoutingParameter {
fn is_initialized(&self) -> bool {
true
}
fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
while !is.eof()? {
let (field_number, wire_type) = is.read_tag_unpack()?;
match field_number {
1 => {
::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field)?;
},
2 => {
::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.path_template)?;
},
_ => {
::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
},
};
}
::std::result::Result::Ok(())
}
#[allow(unused_variables)]
fn compute_size(&self) -> u32 {
let mut my_size = 0;
if !self.field.is_empty() {
my_size += ::protobuf::rt::string_size(1, &self.field);
}
if !self.path_template.is_empty() {
my_size += ::protobuf::rt::string_size(2, &self.path_template);
}
my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
self.cached_size.set(my_size);
my_size
}
fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
if !self.field.is_empty() {
os.write_string(1, &self.field)?;
}
if !self.path_template.is_empty() {
os.write_string(2, &self.path_template)?;
}
os.write_unknown_fields(self.get_unknown_fields())?;
::std::result::Result::Ok(())
}
fn get_cached_size(&self) -> u32 {
self.cached_size.get()
}
fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
&self.unknown_fields
}
fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
&mut self.unknown_fields
}
fn as_any(&self) -> &dyn (::std::any::Any) {
self as &dyn (::std::any::Any)
}
fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
self as &mut dyn (::std::any::Any)
}
fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
self
}
fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
Self::descriptor_static()
}
fn new() -> RoutingParameter {
RoutingParameter::new()
}
fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
descriptor.get(|| {
let mut fields = ::std::vec::Vec::new();
fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
"field",
|m: &RoutingParameter| { &m.field },
|m: &mut RoutingParameter| { &mut m.field },
));
fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
"path_template",
|m: &RoutingParameter| { &m.path_template },
|m: &mut RoutingParameter| { &mut m.path_template },
));
::protobuf::reflect::MessageDescriptor::new_pb_name::<RoutingParameter>(
"RoutingParameter",
fields,
file_descriptor_proto()
)
})
}
fn default_instance() -> &'static RoutingParameter {
static instance: ::protobuf::rt::LazyV2<RoutingParameter> = ::protobuf::rt::LazyV2::INIT;
instance.get(RoutingParameter::new)
}
}
impl ::protobuf::Clear for RoutingParameter {
fn clear(&mut self) {
self.field.clear();
self.path_template.clear();
self.unknown_fields.clear();
}
}
impl ::std::fmt::Debug for RoutingParameter {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
::protobuf::text_format::fmt(self, f)
}
}
impl ::protobuf::reflect::ProtobufValue for RoutingParameter {
fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
::protobuf::reflect::ReflectValueRef::Message(self)
}
}
pub mod exts {
pub const routing: ::protobuf::ext::ExtFieldOptional<::protobuf::descriptor::MethodOptions, ::protobuf::types::ProtobufTypeMessage<super::RoutingRule>> = ::protobuf::ext::ExtFieldOptional { field_number: 72295729, phantom: ::std::marker::PhantomData };
}
static file_descriptor_proto_data: &'static [u8] = b"\
\n\x18google/api/routing.proto\x12\ngoogle.api\x1a\x20google/protobuf/de\
scriptor.proto\"Z\n\x0bRoutingRule\x12K\n\x12routing_parameters\x18\x02\
\x20\x03(\x0b2\x1c.google.api.RoutingParameterR\x11routingParameters\"M\
\n\x10RoutingParameter\x12\x14\n\x05field\x18\x01\x20\x01(\tR\x05field\
\x12#\n\rpath_template\x18\x02\x20\x01(\tR\x0cpathTemplate:T\n\x07routin\
g\x18\xb1\xca\xbc\"\x20\x01(\x0b2\x17.google.api.RoutingRule\x12\x1e.goo\
gle.protobuf.MethodOptionsR\x07routingBj\n\x0ecom.google.apiB\x0cRouting\
ProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;annota\
tions\xa2\x02\x04GAPIJ\x94l\n\x07\x12\x05\x0e\0\xcc\x03\x01\n\xbc\x04\n\
\x01\x0c\x12\x03\x0e\0\x122\xb1\x04\x20Copyright\x202023\x20Google\x20LL\
C\n\n\x20Licensed\x20under\x20the\x20Apache\x20License,\x20Version\x202.\
0\x20(the\x20\"License\");\n\x20you\x20may\x20not\x20use\x20this\x20file\
\x20except\x20in\x20compliance\x20with\x20the\x20License.\n\x20You\x20ma\
y\x20obtain\x20a\x20copy\x20of\x20the\x20License\x20at\n\n\x20\x20\x20\
\x20\x20http://www.apache.org/licenses/LICENSE-2.0\n\n\x20Unless\x20requ\
ired\x20by\x20applicable\x20law\x20or\x20agreed\x20to\x20in\x20writing,\
\x20software\n\x20distributed\x20under\x20the\x20License\x20is\x20distri\
buted\x20on\x20an\x20\"AS\x20IS\"\x20BASIS,\n\x20WITHOUT\x20WARRANTIES\
\x20OR\x20CONDITIONS\x20OF\x20ANY\x20KIND,\x20either\x20express\x20or\
\x20implied.\n\x20See\x20the\x20License\x20for\x20the\x20specific\x20lan\
guage\x20governing\x20permissions\x20and\n\x20limitations\x20under\x20th\
e\x20License.\n\n\x08\n\x01\x02\x12\x03\x10\0\x13\n\t\n\x02\x03\0\x12\
\x03\x12\0*\n\x08\n\x01\x08\x12\x03\x14\0X\n\t\n\x02\x08\x0b\x12\x03\x14\
\0X\n\x08\n\x01\x08\x12\x03\x15\0\"\n\t\n\x02\x08\n\x12\x03\x15\0\"\n\
\x08\n\x01\x08\x12\x03\x16\0-\n\t\n\x02\x08\x08\x12\x03\x16\0-\n\x08\n\
\x01\x08\x12\x03\x17\0'\n\t\n\x02\x08\x01\x12\x03\x17\0'\n\x08\n\x01\x08\
\x12\x03\x18\0\"\n\t\n\x02\x08$\x12\x03\x18\0\"\n\t\n\x01\x07\x12\x04\
\x1a\0\x1d\x01\n\x1d\n\x02\x07\0\x12\x03\x1c\x02,\x1a\x12\x20See\x20Rout\
ingRule.\n\n\n\n\x03\x07\0\x02\x12\x03\x1a\x07$\n\n\n\x03\x07\0\x06\x12\
\x03\x1c\x02\x18\n\n\n\x03\x07\0\x01\x12\x03\x1c\x19\x20\n\n\n\x03\x07\0\
\x03\x12\x03\x1c#+\n\xcbN\n\x02\x04\0\x12\x06\x86\x03\0\x8e\x03\x01\x1a\
\xbcN\x20Specifies\x20the\x20routing\x20information\x20that\x20should\
\x20be\x20sent\x20along\x20with\x20the\x20request\n\x20in\x20the\x20form\
\x20of\x20routing\x20header.\n\x20**NOTE:**\x20All\x20service\x20configu\
ration\x20rules\x20follow\x20the\x20\"last\x20one\x20wins\"\x20order.\n\
\n\x20The\x20examples\x20below\x20will\x20apply\x20to\x20an\x20RPC\x20wh\
ich\x20has\x20the\x20following\x20request\x20type:\n\n\x20Message\x20Def\
inition:\n\n\x20\x20\x20\x20\x20message\x20Request\x20{\n\x20\x20\x20\
\x20\x20\x20\x20//\x20The\x20name\x20of\x20the\x20Table\n\x20\x20\x20\
\x20\x20\x20\x20//\x20Values\x20can\x20be\x20of\x20the\x20following\x20f\
ormats:\n\x20\x20\x20\x20\x20\x20\x20//\x20-\x20`projects/<project>/tabl\
es/<table>`\n\x20\x20\x20\x20\x20\x20\x20//\x20-\x20`projects/<project>/\
instances/<instance>/tables/<table>`\n\x20\x20\x20\x20\x20\x20\x20//\x20\
-\x20`region/<region>/zones/<zone>/tables/<table>`\n\x20\x20\x20\x20\x20\
\x20\x20string\x20table_name\x20=\x201;\n\n\x20\x20\x20\x20\x20\x20\x20/\
/\x20This\x20value\x20specifies\x20routing\x20for\x20replication.\n\x20\
\x20\x20\x20\x20\x20\x20//\x20It\x20can\x20be\x20in\x20the\x20following\
\x20formats:\n\x20\x20\x20\x20\x20\x20\x20//\x20-\x20`profiles/<profile_\
id>`\n\x20\x20\x20\x20\x20\x20\x20//\x20-\x20a\x20legacy\x20`profile_id`\
\x20that\x20can\x20be\x20any\x20string\n\x20\x20\x20\x20\x20\x20\x20stri\
ng\x20app_profile_id\x20=\x202;\n\x20\x20\x20\x20\x20}\n\n\x20Example\
\x20message:\n\n\x20\x20\x20\x20\x20{\n\x20\x20\x20\x20\x20\x20\x20table\
_name:\x20projects/proj_foo/instances/instance_bar/table/table_baz,\n\
\x20\x20\x20\x20\x20\x20\x20app_profile_id:\x20profiles/prof_qux\n\x20\
\x20\x20\x20\x20}\n\n\x20The\x20routing\x20header\x20consists\x20of\x20o\
ne\x20or\x20multiple\x20key-value\x20pairs.\x20Every\x20key\n\x20and\x20\
value\x20must\x20be\x20percent-encoded,\x20and\x20joined\x20together\x20\
in\x20the\x20format\x20of\n\x20`key1=value1&key2=value2`.\n\x20In\x20the\
\x20examples\x20below\x20I\x20am\x20skipping\x20the\x20percent-encoding\
\x20for\x20readablity.\n\n\x20Example\x201\n\n\x20Extracting\x20a\x20fie\
ld\x20from\x20the\x20request\x20to\x20put\x20into\x20the\x20routing\x20h\
eader\n\x20unchanged,\x20with\x20the\x20key\x20equal\x20to\x20the\x20fie\
ld\x20name.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.\
api.routing)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20Take\x20the\
\x20`app_profile_id`.\n\x20\x20\x20\x20\x20\x20\x20routing_parameters\
\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"app_profile_id\"\
\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\
\n\x20\x20\x20\x20\x20x-goog-request-params:\x20app_profile_id=profiles/\
prof_qux\n\n\x20Example\x202\n\n\x20Extracting\x20a\x20field\x20from\x20\
the\x20request\x20to\x20put\x20into\x20the\x20routing\x20header\n\x20unc\
hanged,\x20with\x20the\x20key\x20different\x20from\x20the\x20field\x20na\
me.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.rout\
ing)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20Take\x20the\x20`app_pr\
ofile_id`,\x20but\x20name\x20it\x20`routing_id`\x20in\x20the\x20header.\
\n\x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\
\x20\x20\x20\x20\x20field:\x20\"app_profile_id\"\n\x20\x20\x20\x20\x20\
\x20\x20\x20\x20path_template:\x20\"{routing_id=**}\"\n\x20\x20\x20\x20\
\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\n\x20\x20\x20\x20\
\x20x-goog-request-params:\x20routing_id=profiles/prof_qux\n\n\x20Exampl\
e\x203\n\n\x20Extracting\x20a\x20field\x20from\x20the\x20request\x20to\
\x20put\x20into\x20the\x20routing\n\x20header,\x20while\x20matching\x20a\
\x20path\x20template\x20syntax\x20on\x20the\x20field's\x20value.\n\n\x20\
NB:\x20it\x20is\x20more\x20useful\x20to\x20send\x20nothing\x20than\x20to\
\x20send\x20garbage\x20for\x20the\x20purpose\n\x20of\x20dynamic\x20routi\
ng,\x20since\x20garbage\x20pollutes\x20cache.\x20Thus\x20the\x20matching\
.\n\n\x20Sub-example\x203a\n\n\x20The\x20field\x20matches\x20the\x20temp\
late.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.ro\
uting)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20Take\x20the\x20`tabl\
e_name`,\x20if\x20it's\x20well-formed\x20(with\x20project-based\n\x20\
\x20\x20\x20\x20\x20\x20//\x20syntax).\n\x20\x20\x20\x20\x20\x20\x20rout\
ing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"tab\
le_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{tabl\
e_name=projects/*/instances/*/**}\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\
\x20\x20\x20\x20};\n\n\x20result:\n\n\x20\x20\x20\x20\x20x-goog-request-\
params:\n\x20\x20\x20\x20\x20table_name=projects/proj_foo/instances/inst\
ance_bar/table/table_baz\n\n\x20Sub-example\x203b\n\n\x20The\x20field\
\x20does\x20not\x20match\x20the\x20template.\n\n\x20annotation:\n\n\x20\
\x20\x20\x20\x20option\x20(google.api.routing)\x20=\x20{\n\x20\x20\x20\
\x20\x20\x20\x20//\x20Take\x20the\x20`table_name`,\x20if\x20it's\x20well\
-formed\x20(with\x20region-based\n\x20\x20\x20\x20\x20\x20\x20//\x20synt\
ax).\n\x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\
\x20\x20\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\
\x20\x20\x20\x20path_template:\x20\"{table_name=regions/*/zones/*/**}\"\
\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\
\n\x20\x20\x20\x20\x20<no\x20routing\x20header\x20will\x20be\x20sent>\n\
\n\x20Sub-example\x203c\n\n\x20Multiple\x20alternative\x20conflictingly\
\x20named\x20path\x20templates\x20are\n\x20specified.\x20The\x20one\x20t\
hat\x20matches\x20is\x20used\x20to\x20construct\x20the\x20header.\n\n\
\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.routing)\
\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20Take\x20the\x20`table_name\
`,\x20if\x20it's\x20well-formed,\x20whether\n\x20\x20\x20\x20\x20\x20\
\x20//\x20using\x20the\x20region-\x20or\x20projects-based\x20syntax.\n\n\
\x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\
\x20\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\
\x20\x20\x20path_template:\x20\"{table_name=regions/*/zones/*/**}\"\n\
\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\x20routing_param\
eters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"table_name\"\
\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{table_name=pr\
ojects/*/instances/*/**}\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\
\x20\x20};\n\n\x20result:\n\n\x20\x20\x20\x20\x20x-goog-request-params:\
\n\x20\x20\x20\x20\x20table_name=projects/proj_foo/instances/instance_ba\
r/table/table_baz\n\n\x20Example\x204\n\n\x20Extracting\x20a\x20single\
\x20routing\x20header\x20key-value\x20pair\x20by\x20matching\x20a\n\x20t\
emplate\x20syntax\x20on\x20(a\x20part\x20of)\x20a\x20single\x20request\
\x20field.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.a\
pi.routing)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20Take\x20just\
\x20the\x20project\x20id\x20from\x20the\x20`table_name`\x20field.\n\x20\
\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\
\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\
\x20\x20path_template:\x20\"{routing_id=projects/*}/**\"\n\x20\x20\x20\
\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\n\x20\x20\x20\
\x20\x20x-goog-request-params:\x20routing_id=projects/proj_foo\n\n\x20Ex\
ample\x205\n\n\x20Extracting\x20a\x20single\x20routing\x20header\x20key-\
value\x20pair\x20by\x20matching\n\x20several\x20conflictingly\x20named\
\x20path\x20templates\x20on\x20(parts\x20of)\x20a\x20single\x20request\n\
\x20field.\x20The\x20last\x20template\x20to\x20match\x20\"wins\"\x20the\
\x20conflict.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(googl\
e.api.routing)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20If\x20the\
\x20`table_name`\x20does\x20not\x20have\x20instances\x20information,\n\
\x20\x20\x20\x20\x20\x20\x20//\x20take\x20just\x20the\x20project\x20id\
\x20for\x20routing.\n\x20\x20\x20\x20\x20\x20\x20//\x20Otherwise\x20take\
\x20project\x20+\x20instance.\n\n\x20\x20\x20\x20\x20\x20\x20routing_par\
ameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"table_name\
\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{routing_id=\
projects/*}/**\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\
\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20fie\
ld:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template\
:\x20\"{routing_id=projects/*/instances/*}/**\"\n\x20\x20\x20\x20\x20\
\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\n\x20\x20\x20\x20\x20\
x-goog-request-params:\n\x20\x20\x20\x20\x20routing_id=projects/proj_foo\
/instances/instance_bar\n\n\x20Example\x206\n\n\x20Extracting\x20multipl\
e\x20routing\x20header\x20key-value\x20pairs\x20by\x20matching\n\x20seve\
ral\x20non-conflicting\x20path\x20templates\x20on\x20(parts\x20of)\x20a\
\x20single\x20request\x20field.\n\n\x20Sub-example\x206a\n\n\x20Make\x20\
the\x20templates\x20strict,\x20so\x20that\x20if\x20the\x20`table_name`\
\x20does\x20not\n\x20have\x20an\x20instance\x20information,\x20nothing\
\x20is\x20sent.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(goo\
gle.api.routing)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20The\x20rou\
ting\x20code\x20needs\x20two\x20keys\x20instead\x20of\x20one\x20composit\
e\n\x20\x20\x20\x20\x20\x20\x20//\x20but\x20works\x20only\x20for\x20the\
\x20tables\x20with\x20the\x20\"project-instance\"\x20name\n\x20\x20\x20\
\x20\x20\x20\x20//\x20syntax.\n\n\x20\x20\x20\x20\x20\x20\x20routing_par\
ameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"table_name\
\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{project_id=\
projects/*}/instances/*/**\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\
\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\
\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\
\x20path_template:\x20\"projects/*/{instance_id=instances/*}/**\"\n\x20\
\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\n\x20\
\x20\x20\x20\x20x-goog-request-params:\n\x20\x20\x20\x20\x20project_id=p\
rojects/proj_foo&instance_id=instances/instance_bar\n\n\x20Sub-example\
\x206b\n\n\x20Make\x20the\x20templates\x20loose,\x20so\x20that\x20if\x20\
the\x20`table_name`\x20does\x20not\n\x20have\x20an\x20instance\x20inform\
ation,\x20just\x20the\x20project\x20id\x20part\x20is\x20sent.\n\n\x20ann\
otation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.routing)\x20=\x20{\
\n\x20\x20\x20\x20\x20\x20\x20//\x20The\x20routing\x20code\x20wants\x20t\
wo\x20keys\x20instead\x20of\x20one\x20composite\n\x20\x20\x20\x20\x20\
\x20\x20//\x20but\x20will\x20work\x20with\x20just\x20the\x20`project_id`\
\x20for\x20tables\x20without\n\x20\x20\x20\x20\x20\x20\x20//\x20an\x20in\
stance\x20in\x20the\x20`table_name`.\n\n\x20\x20\x20\x20\x20\x20\x20rout\
ing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"tab\
le_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{proj\
ect_id=projects/*}/**\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\
\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\
\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_t\
emplate:\x20\"projects/*/{instance_id=instances/*}/**\"\n\x20\x20\x20\
\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result\x20(is\x20the\
\x20same\x20as\x206a\x20for\x20our\x20example\x20message\x20because\x20i\
t\x20has\x20the\x20instance\n\x20information):\n\n\x20\x20\x20\x20\x20x-\
goog-request-params:\n\x20\x20\x20\x20\x20project_id=projects/proj_foo&i\
nstance_id=instances/instance_bar\n\n\x20Example\x207\n\n\x20Extracting\
\x20multiple\x20routing\x20header\x20key-value\x20pairs\x20by\x20matchin\
g\n\x20several\x20path\x20templates\x20on\x20multiple\x20request\x20fiel\
ds.\n\n\x20NB:\x20note\x20that\x20here\x20there\x20is\x20no\x20way\x20to\
\x20specify\x20sending\x20nothing\x20if\x20one\x20of\x20the\n\x20fields\
\x20does\x20not\x20match\x20its\x20template.\x20E.g.\x20if\x20the\x20`ta\
ble_name`\x20is\x20in\x20the\x20wrong\n\x20format,\x20the\x20`project_id\
`\x20will\x20not\x20be\x20sent,\x20but\x20the\x20`routing_id`\x20will\
\x20be.\n\x20The\x20backend\x20routing\x20code\x20has\x20to\x20be\x20awa\
re\x20of\x20that\x20and\x20be\x20prepared\x20to\x20not\n\x20receive\x20a\
\x20full\x20complement\x20of\x20keys\x20if\x20it\x20expects\x20multiple.\
\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.routing\
)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20The\x20routing\x20needs\
\x20both\x20`project_id`\x20and\x20`routing_id`\n\x20\x20\x20\x20\x20\
\x20\x20//\x20(from\x20the\x20`app_profile_id`\x20field)\x20for\x20routi\
ng.\n\n\x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\
\x20\x20\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\
\x20\x20\x20\x20path_template:\x20\"{project_id=projects/*}/**\"\n\x20\
\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\x20routing_parameter\
s\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"app_profile_id\"\
\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{routing_id=**\
}\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result\
:\n\n\x20\x20\x20\x20\x20x-goog-request-params:\n\x20\x20\x20\x20\x20pro\
ject_id=projects/proj_foo&routing_id=profiles/prof_qux\n\n\x20Example\
\x208\n\n\x20Extracting\x20a\x20single\x20routing\x20header\x20key-value\
\x20pair\x20by\x20matching\n\x20several\x20conflictingly\x20named\x20pat\
h\x20templates\x20on\x20several\x20request\x20fields.\x20The\n\x20last\
\x20template\x20to\x20match\x20\"wins\"\x20the\x20conflict.\n\n\x20annot\
ation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.routing)\x20=\x20{\n\
\x20\x20\x20\x20\x20\x20\x20//\x20The\x20`routing_id`\x20can\x20be\x20a\
\x20project\x20id\x20or\x20a\x20region\x20id\x20depending\x20on\n\x20\
\x20\x20\x20\x20\x20\x20//\x20the\x20table\x20name\x20format,\x20but\x20\
only\x20if\x20the\x20`app_profile_id`\x20is\x20not\x20set.\n\x20\x20\x20\
\x20\x20\x20\x20//\x20If\x20`app_profile_id`\x20is\x20set\x20it\x20shoul\
d\x20be\x20used\x20instead.\n\n\x20\x20\x20\x20\x20\x20\x20routing_param\
eters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"table_name\"\
\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{routing_id=pr\
ojects/*}/**\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\
\x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fie\
ld:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20path_temp\
late:\x20\"{routing_id=regions/*}/**\"\n\x20\x20\x20\x20\x20\x20\x20}\n\
\x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\
\x20\x20\x20\x20\x20field:\x20\"app_profile_id\"\n\x20\x20\x20\x20\x20\
\x20\x20\x20\x20path_template:\x20\"{routing_id=**}\"\n\x20\x20\x20\x20\
\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\n\x20\x20\x20\x20\
\x20x-goog-request-params:\x20routing_id=profiles/prof_qux\n\n\x20Exampl\
e\x209\n\n\x20Bringing\x20it\x20all\x20together.\n\n\x20annotation:\n\n\
\x20\x20\x20\x20\x20option\x20(google.api.routing)\x20=\x20{\n\x20\x20\
\x20\x20\x20\x20\x20//\x20For\x20routing\x20both\x20`table_location`\x20\
and\x20a\x20`routing_id`\x20are\x20needed.\n\x20\x20\x20\x20\x20\x20\x20\
//\n\x20\x20\x20\x20\x20\x20\x20//\x20table_location\x20can\x20be\x20eit\
her\x20an\x20instance\x20id\x20or\x20a\x20region+zone\x20id.\n\x20\x20\
\x20\x20\x20\x20\x20//\n\x20\x20\x20\x20\x20\x20\x20//\x20For\x20`routin\
g_id`,\x20take\x20the\x20value\x20of\x20`app_profile_id`\n\x20\x20\x20\
\x20\x20\x20\x20//\x20-\x20If\x20it's\x20in\x20the\x20format\x20`profile\
s/<profile_id>`,\x20send\n\x20\x20\x20\x20\x20\x20\x20//\x20just\x20the\
\x20`<profile_id>`\x20part.\n\x20\x20\x20\x20\x20\x20\x20//\x20-\x20If\
\x20it's\x20any\x20other\x20literal,\x20send\x20it\x20as\x20is.\n\x20\
\x20\x20\x20\x20\x20\x20//\x20If\x20the\x20`app_profile_id`\x20is\x20emp\
ty,\x20and\x20the\x20`table_name`\x20starts\x20with\n\x20\x20\x20\x20\
\x20\x20\x20//\x20the\x20project_id,\x20send\x20that\x20instead.\n\n\x20\
\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\
\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\
\x20\x20path_template:\x20\"projects/*/{table_location=instances/*}/tabl\
es/*\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\x20routi\
ng_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"tabl\
e_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{table\
_location=regions/*/zones/*}/tables/*\"\n\x20\x20\x20\x20\x20\x20\x20}\n\
\x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\
\x20\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\
\x20\x20\x20path_template:\x20\"{routing_id=projects/*}/**\"\n\x20\x20\
\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\x20routing_parameters\
\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"app_profile_id\"\
\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{routing_id=**\
}\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\x20routing_\
parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"app_pro\
file_id\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"profi\
les/{routing_id=*}\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\
\x20};\n\n\x20result:\n\n\x20\x20\x20\x20\x20x-goog-request-params:\n\
\x20\x20\x20\x20\x20table_location=instances/instance_bar&routing_id=pro\
f_qux\n\n\x0b\n\x03\x04\0\x01\x12\x04\x86\x03\x08\x13\n\xc3\x02\n\x04\
\x04\0\x02\0\x12\x04\x8d\x03\x023\x1a\xb4\x02\x20A\x20collection\x20of\
\x20Routing\x20Parameter\x20specifications.\n\x20**NOTE:**\x20If\x20mult\
iple\x20Routing\x20Parameters\x20describe\x20the\x20same\x20key\n\x20(vi\
a\x20the\x20`path_template`\x20field\x20or\x20via\x20the\x20`field`\x20f\
ield\x20when\n\x20`path_template`\x20is\x20not\x20provided),\x20\"last\
\x20one\x20wins\"\x20rule\n\x20determines\x20which\x20Parameter\x20gets\
\x20used.\n\x20See\x20the\x20examples\x20for\x20more\x20details.\n\n\r\n\
\x05\x04\0\x02\0\x04\x12\x04\x8d\x03\x02\n\n\r\n\x05\x04\0\x02\0\x06\x12\
\x04\x8d\x03\x0b\x1b\n\r\n\x05\x04\0\x02\0\x01\x12\x04\x8d\x03\x1c.\n\r\
\n\x05\x04\0\x02\0\x03\x12\x04\x8d\x0312\nN\n\x02\x04\x01\x12\x06\x91\
\x03\0\xcc\x03\x01\x1a@\x20A\x20projection\x20from\x20an\x20input\x20mes\
sage\x20to\x20the\x20GRPC\x20or\x20REST\x20header.\n\n\x0b\n\x03\x04\x01\
\x01\x12\x04\x91\x03\x08\x18\nJ\n\x04\x04\x01\x02\0\x12\x04\x93\x03\x02\
\x13\x1a<\x20A\x20request\x20field\x20to\x20extract\x20the\x20header\x20\
key-value\x20pair\x20from.\n\n\r\n\x05\x04\x01\x02\0\x05\x12\x04\x93\x03\
\x02\x08\n\r\n\x05\x04\x01\x02\0\x01\x12\x04\x93\x03\t\x0e\n\r\n\x05\x04\
\x01\x02\0\x03\x12\x04\x93\x03\x11\x12\n\x91\x12\n\x04\x04\x01\x02\x01\
\x12\x04\xcb\x03\x02\x1b\x1a\x82\x12\x20A\x20pattern\x20matching\x20the\
\x20key-value\x20field.\x20Optional.\n\x20If\x20not\x20specified,\x20the\
\x20whole\x20field\x20specified\x20in\x20the\x20`field`\x20field\x20will\
\x20be\n\x20taken\x20as\x20value,\x20and\x20its\x20name\x20used\x20as\
\x20key.\x20If\x20specified,\x20it\x20MUST\x20contain\n\x20exactly\x20on\
e\x20named\x20segment\x20(along\x20with\x20any\x20number\x20of\x20unname\
d\x20segments)\x20The\n\x20pattern\x20will\x20be\x20matched\x20over\x20t\
he\x20field\x20specified\x20in\x20the\x20`field`\x20field,\x20then\n\x20\
if\x20the\x20match\x20is\x20successful:\n\x20-\x20the\x20name\x20of\x20t\
he\x20single\x20named\x20segment\x20will\x20be\x20used\x20as\x20a\x20hea\
der\x20name,\n\x20-\x20the\x20match\x20value\x20of\x20the\x20segment\x20\
will\x20be\x20used\x20as\x20a\x20header\x20value;\n\x20if\x20the\x20matc\
h\x20is\x20NOT\x20successful,\x20nothing\x20will\x20be\x20sent.\n\n\x20E\
xample:\n\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\
-\x20This\x20is\x20a\x20field\x20in\x20the\x20request\x20message\n\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\x20\x20\x20that\
\x20the\x20header\x20value\x20will\x20be\x20extracted\x20from.\n\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\n\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20|\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20--\x20This\x20is\x20\
the\x20key\x20name\x20in\x20the\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20|\x20\x20\x20routing\x20header.\n\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20V\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\n\x20\
\x20\x20\x20\x20field:\x20\"table_name\"\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20v\n\x20\x20\x20\x20\x20path_template:\x20\"projects/*/{table\
_location=instances/*}/tables/*\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20^\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20^\n\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20|\n\x20\x20\x20\x20\x20\x20\x20In\x20the\x20{}\x20br\
ackets\x20is\x20the\x20pattern\x20that\x20--\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20|\n\x20\x20\x20\x20\x20\x20\x20specifies\x20what\
\x20to\x20extract\x20from\x20the\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\n\x20\x20\x20\x20\x20\x20\x20f\
ield\x20as\x20a\x20value\x20to\x20be\x20sent.\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20|\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\n\x20\x20\x20\x20\x20\x20The\
\x20string\x20in\x20the\x20field\x20must\x20match\x20the\x20whole\x20pat\
tern\x20--\n\x20\x20\x20\x20\x20\x20before\x20brackets,\x20inside\x20bra\
ckets,\x20after\x20brackets.\n\n\x20When\x20looking\x20at\x20this\x20spe\
cific\x20example,\x20we\x20can\x20see\x20that:\n\x20-\x20A\x20key-value\
\x20pair\x20with\x20the\x20key\x20`table_location`\n\x20\x20\x20and\x20t\
he\x20value\x20matching\x20`instances/*`\x20should\x20be\x20added\n\x20\
\x20\x20to\x20the\x20x-goog-request-params\x20routing\x20header.\n\x20-\
\x20The\x20value\x20is\x20extracted\x20from\x20the\x20request\x20message\
's\x20`table_name`\x20field\n\x20\x20\x20if\x20it\x20matches\x20the\x20f\
ull\x20pattern\x20specified:\n\x20\x20\x20`projects/*/instances/*/tables\
/*`.\n\n\x20**NB:**\x20If\x20the\x20`path_template`\x20field\x20is\x20no\
t\x20provided,\x20the\x20key\x20name\x20is\n\x20equal\x20to\x20the\x20fi\
eld\x20name,\x20and\x20the\x20whole\x20field\x20should\x20be\x20sent\x20\
as\x20a\x20value.\n\x20This\x20makes\x20the\x20pattern\x20for\x20the\x20\
field\x20and\x20the\x20value\x20functionally\x20equivalent\n\x20to\x20`*\
*`,\x20and\x20the\x20configuration\n\n\x20\x20\x20\x20\x20{\n\x20\x20\
\x20\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20}\n\n\
\x20is\x20a\x20functionally\x20equivalent\x20shorthand\x20to:\n\n\x20\
\x20\x20\x20\x20{\n\x20\x20\x20\x20\x20\x20\x20field:\x20\"table_name\"\
\n\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{table_name=**}\"\n\
\x20\x20\x20\x20\x20}\n\n\x20See\x20Example\x201\x20for\x20more\x20detai\
ls.\n\n\r\n\x05\x04\x01\x02\x01\x05\x12\x04\xcb\x03\x02\x08\n\r\n\x05\
\x04\x01\x02\x01\x01\x12\x04\xcb\x03\t\x16\n\r\n\x05\x04\x01\x02\x01\x03\
\x12\x04\xcb\x03\x19\x1ab\x06proto3\
";
static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
}
pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
file_descriptor_proto_lazy.get(|| {
parse_descriptor_proto()
})
}