google_cloud_rust_raw/api/
routing.rs

1// This file is generated by rust-protobuf 2.28.0. Do not edit
2// @generated
3
4// https://github.com/rust-lang/rust-clippy/issues/702
5#![allow(unknown_lints)]
6#![allow(clippy::all)]
7
8#![allow(unused_attributes)]
9#![cfg_attr(rustfmt, rustfmt::skip)]
10
11#![allow(box_pointers)]
12#![allow(dead_code)]
13#![allow(missing_docs)]
14#![allow(non_camel_case_types)]
15#![allow(non_snake_case)]
16#![allow(non_upper_case_globals)]
17#![allow(trivial_casts)]
18#![allow(unused_imports)]
19#![allow(unused_results)]
20//! Generated file from `google/api/routing.proto`
21
22/// Generated files are compatible only with the same version
23/// of protobuf runtime.
24// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_28_0;
25
26#[derive(PartialEq,Clone,Default)]
27pub struct RoutingRule {
28    // message fields
29    pub routing_parameters: ::protobuf::RepeatedField<RoutingParameter>,
30    // special fields
31    pub unknown_fields: ::protobuf::UnknownFields,
32    pub cached_size: ::protobuf::CachedSize,
33}
34
35impl<'a> ::std::default::Default for &'a RoutingRule {
36    fn default() -> &'a RoutingRule {
37        <RoutingRule as ::protobuf::Message>::default_instance()
38    }
39}
40
41impl RoutingRule {
42    pub fn new() -> RoutingRule {
43        ::std::default::Default::default()
44    }
45
46    // repeated .google.api.RoutingParameter routing_parameters = 2;
47
48
49    pub fn get_routing_parameters(&self) -> &[RoutingParameter] {
50        &self.routing_parameters
51    }
52    pub fn clear_routing_parameters(&mut self) {
53        self.routing_parameters.clear();
54    }
55
56    // Param is passed by value, moved
57    pub fn set_routing_parameters(&mut self, v: ::protobuf::RepeatedField<RoutingParameter>) {
58        self.routing_parameters = v;
59    }
60
61    // Mutable pointer to the field.
62    pub fn mut_routing_parameters(&mut self) -> &mut ::protobuf::RepeatedField<RoutingParameter> {
63        &mut self.routing_parameters
64    }
65
66    // Take field
67    pub fn take_routing_parameters(&mut self) -> ::protobuf::RepeatedField<RoutingParameter> {
68        ::std::mem::replace(&mut self.routing_parameters, ::protobuf::RepeatedField::new())
69    }
70}
71
72impl ::protobuf::Message for RoutingRule {
73    fn is_initialized(&self) -> bool {
74        for v in &self.routing_parameters {
75            if !v.is_initialized() {
76                return false;
77            }
78        };
79        true
80    }
81
82    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
83        while !is.eof()? {
84            let (field_number, wire_type) = is.read_tag_unpack()?;
85            match field_number {
86                2 => {
87                    ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.routing_parameters)?;
88                },
89                _ => {
90                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
91                },
92            };
93        }
94        ::std::result::Result::Ok(())
95    }
96
97    // Compute sizes of nested messages
98    #[allow(unused_variables)]
99    fn compute_size(&self) -> u32 {
100        let mut my_size = 0;
101        for value in &self.routing_parameters {
102            let len = value.compute_size();
103            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
104        };
105        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
106        self.cached_size.set(my_size);
107        my_size
108    }
109
110    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
111        for v in &self.routing_parameters {
112            os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?;
113            os.write_raw_varint32(v.get_cached_size())?;
114            v.write_to_with_cached_sizes(os)?;
115        };
116        os.write_unknown_fields(self.get_unknown_fields())?;
117        ::std::result::Result::Ok(())
118    }
119
120    fn get_cached_size(&self) -> u32 {
121        self.cached_size.get()
122    }
123
124    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
125        &self.unknown_fields
126    }
127
128    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
129        &mut self.unknown_fields
130    }
131
132    fn as_any(&self) -> &dyn (::std::any::Any) {
133        self as &dyn (::std::any::Any)
134    }
135    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
136        self as &mut dyn (::std::any::Any)
137    }
138    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
139        self
140    }
141
142    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
143        Self::descriptor_static()
144    }
145
146    fn new() -> RoutingRule {
147        RoutingRule::new()
148    }
149
150    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
151        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
152        descriptor.get(|| {
153            let mut fields = ::std::vec::Vec::new();
154            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<RoutingParameter>>(
155                "routing_parameters",
156                |m: &RoutingRule| { &m.routing_parameters },
157                |m: &mut RoutingRule| { &mut m.routing_parameters },
158            ));
159            ::protobuf::reflect::MessageDescriptor::new_pb_name::<RoutingRule>(
160                "RoutingRule",
161                fields,
162                file_descriptor_proto()
163            )
164        })
165    }
166
167    fn default_instance() -> &'static RoutingRule {
168        static instance: ::protobuf::rt::LazyV2<RoutingRule> = ::protobuf::rt::LazyV2::INIT;
169        instance.get(RoutingRule::new)
170    }
171}
172
173impl ::protobuf::Clear for RoutingRule {
174    fn clear(&mut self) {
175        self.routing_parameters.clear();
176        self.unknown_fields.clear();
177    }
178}
179
180impl ::std::fmt::Debug for RoutingRule {
181    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
182        ::protobuf::text_format::fmt(self, f)
183    }
184}
185
186impl ::protobuf::reflect::ProtobufValue for RoutingRule {
187    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
188        ::protobuf::reflect::ReflectValueRef::Message(self)
189    }
190}
191
192#[derive(PartialEq,Clone,Default)]
193pub struct RoutingParameter {
194    // message fields
195    pub field: ::std::string::String,
196    pub path_template: ::std::string::String,
197    // special fields
198    pub unknown_fields: ::protobuf::UnknownFields,
199    pub cached_size: ::protobuf::CachedSize,
200}
201
202impl<'a> ::std::default::Default for &'a RoutingParameter {
203    fn default() -> &'a RoutingParameter {
204        <RoutingParameter as ::protobuf::Message>::default_instance()
205    }
206}
207
208impl RoutingParameter {
209    pub fn new() -> RoutingParameter {
210        ::std::default::Default::default()
211    }
212
213    // string field = 1;
214
215
216    pub fn get_field(&self) -> &str {
217        &self.field
218    }
219    pub fn clear_field(&mut self) {
220        self.field.clear();
221    }
222
223    // Param is passed by value, moved
224    pub fn set_field(&mut self, v: ::std::string::String) {
225        self.field = v;
226    }
227
228    // Mutable pointer to the field.
229    // If field is not initialized, it is initialized with default value first.
230    pub fn mut_field(&mut self) -> &mut ::std::string::String {
231        &mut self.field
232    }
233
234    // Take field
235    pub fn take_field(&mut self) -> ::std::string::String {
236        ::std::mem::replace(&mut self.field, ::std::string::String::new())
237    }
238
239    // string path_template = 2;
240
241
242    pub fn get_path_template(&self) -> &str {
243        &self.path_template
244    }
245    pub fn clear_path_template(&mut self) {
246        self.path_template.clear();
247    }
248
249    // Param is passed by value, moved
250    pub fn set_path_template(&mut self, v: ::std::string::String) {
251        self.path_template = v;
252    }
253
254    // Mutable pointer to the field.
255    // If field is not initialized, it is initialized with default value first.
256    pub fn mut_path_template(&mut self) -> &mut ::std::string::String {
257        &mut self.path_template
258    }
259
260    // Take field
261    pub fn take_path_template(&mut self) -> ::std::string::String {
262        ::std::mem::replace(&mut self.path_template, ::std::string::String::new())
263    }
264}
265
266impl ::protobuf::Message for RoutingParameter {
267    fn is_initialized(&self) -> bool {
268        true
269    }
270
271    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
272        while !is.eof()? {
273            let (field_number, wire_type) = is.read_tag_unpack()?;
274            match field_number {
275                1 => {
276                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.field)?;
277                },
278                2 => {
279                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.path_template)?;
280                },
281                _ => {
282                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
283                },
284            };
285        }
286        ::std::result::Result::Ok(())
287    }
288
289    // Compute sizes of nested messages
290    #[allow(unused_variables)]
291    fn compute_size(&self) -> u32 {
292        let mut my_size = 0;
293        if !self.field.is_empty() {
294            my_size += ::protobuf::rt::string_size(1, &self.field);
295        }
296        if !self.path_template.is_empty() {
297            my_size += ::protobuf::rt::string_size(2, &self.path_template);
298        }
299        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
300        self.cached_size.set(my_size);
301        my_size
302    }
303
304    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
305        if !self.field.is_empty() {
306            os.write_string(1, &self.field)?;
307        }
308        if !self.path_template.is_empty() {
309            os.write_string(2, &self.path_template)?;
310        }
311        os.write_unknown_fields(self.get_unknown_fields())?;
312        ::std::result::Result::Ok(())
313    }
314
315    fn get_cached_size(&self) -> u32 {
316        self.cached_size.get()
317    }
318
319    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
320        &self.unknown_fields
321    }
322
323    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
324        &mut self.unknown_fields
325    }
326
327    fn as_any(&self) -> &dyn (::std::any::Any) {
328        self as &dyn (::std::any::Any)
329    }
330    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
331        self as &mut dyn (::std::any::Any)
332    }
333    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
334        self
335    }
336
337    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
338        Self::descriptor_static()
339    }
340
341    fn new() -> RoutingParameter {
342        RoutingParameter::new()
343    }
344
345    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
346        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
347        descriptor.get(|| {
348            let mut fields = ::std::vec::Vec::new();
349            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
350                "field",
351                |m: &RoutingParameter| { &m.field },
352                |m: &mut RoutingParameter| { &mut m.field },
353            ));
354            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
355                "path_template",
356                |m: &RoutingParameter| { &m.path_template },
357                |m: &mut RoutingParameter| { &mut m.path_template },
358            ));
359            ::protobuf::reflect::MessageDescriptor::new_pb_name::<RoutingParameter>(
360                "RoutingParameter",
361                fields,
362                file_descriptor_proto()
363            )
364        })
365    }
366
367    fn default_instance() -> &'static RoutingParameter {
368        static instance: ::protobuf::rt::LazyV2<RoutingParameter> = ::protobuf::rt::LazyV2::INIT;
369        instance.get(RoutingParameter::new)
370    }
371}
372
373impl ::protobuf::Clear for RoutingParameter {
374    fn clear(&mut self) {
375        self.field.clear();
376        self.path_template.clear();
377        self.unknown_fields.clear();
378    }
379}
380
381impl ::std::fmt::Debug for RoutingParameter {
382    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
383        ::protobuf::text_format::fmt(self, f)
384    }
385}
386
387impl ::protobuf::reflect::ProtobufValue for RoutingParameter {
388    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
389        ::protobuf::reflect::ReflectValueRef::Message(self)
390    }
391}
392
393/// Extension fields
394pub mod exts {
395
396    pub const routing: ::protobuf::ext::ExtFieldOptional<::protobuf::descriptor::MethodOptions, ::protobuf::types::ProtobufTypeMessage<super::RoutingRule>> = ::protobuf::ext::ExtFieldOptional { field_number: 72295729, phantom: ::std::marker::PhantomData };
397}
398
399static file_descriptor_proto_data: &'static [u8] = b"\
400    \n\x18google/api/routing.proto\x12\ngoogle.api\x1a\x20google/protobuf/de\
401    scriptor.proto\"Z\n\x0bRoutingRule\x12K\n\x12routing_parameters\x18\x02\
402    \x20\x03(\x0b2\x1c.google.api.RoutingParameterR\x11routingParameters\"M\
403    \n\x10RoutingParameter\x12\x14\n\x05field\x18\x01\x20\x01(\tR\x05field\
404    \x12#\n\rpath_template\x18\x02\x20\x01(\tR\x0cpathTemplate:T\n\x07routin\
405    g\x18\xb1\xca\xbc\"\x20\x01(\x0b2\x17.google.api.RoutingRule\x12\x1e.goo\
406    gle.protobuf.MethodOptionsR\x07routingBj\n\x0ecom.google.apiB\x0cRouting\
407    ProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;annota\
408    tions\xa2\x02\x04GAPIJ\x94l\n\x07\x12\x05\x0e\0\xcc\x03\x01\n\xbc\x04\n\
409    \x01\x0c\x12\x03\x0e\0\x122\xb1\x04\x20Copyright\x202023\x20Google\x20LL\
410    C\n\n\x20Licensed\x20under\x20the\x20Apache\x20License,\x20Version\x202.\
411    0\x20(the\x20\"License\");\n\x20you\x20may\x20not\x20use\x20this\x20file\
412    \x20except\x20in\x20compliance\x20with\x20the\x20License.\n\x20You\x20ma\
413    y\x20obtain\x20a\x20copy\x20of\x20the\x20License\x20at\n\n\x20\x20\x20\
414    \x20\x20http://www.apache.org/licenses/LICENSE-2.0\n\n\x20Unless\x20requ\
415    ired\x20by\x20applicable\x20law\x20or\x20agreed\x20to\x20in\x20writing,\
416    \x20software\n\x20distributed\x20under\x20the\x20License\x20is\x20distri\
417    buted\x20on\x20an\x20\"AS\x20IS\"\x20BASIS,\n\x20WITHOUT\x20WARRANTIES\
418    \x20OR\x20CONDITIONS\x20OF\x20ANY\x20KIND,\x20either\x20express\x20or\
419    \x20implied.\n\x20See\x20the\x20License\x20for\x20the\x20specific\x20lan\
420    guage\x20governing\x20permissions\x20and\n\x20limitations\x20under\x20th\
421    e\x20License.\n\n\x08\n\x01\x02\x12\x03\x10\0\x13\n\t\n\x02\x03\0\x12\
422    \x03\x12\0*\n\x08\n\x01\x08\x12\x03\x14\0X\n\t\n\x02\x08\x0b\x12\x03\x14\
423    \0X\n\x08\n\x01\x08\x12\x03\x15\0\"\n\t\n\x02\x08\n\x12\x03\x15\0\"\n\
424    \x08\n\x01\x08\x12\x03\x16\0-\n\t\n\x02\x08\x08\x12\x03\x16\0-\n\x08\n\
425    \x01\x08\x12\x03\x17\0'\n\t\n\x02\x08\x01\x12\x03\x17\0'\n\x08\n\x01\x08\
426    \x12\x03\x18\0\"\n\t\n\x02\x08$\x12\x03\x18\0\"\n\t\n\x01\x07\x12\x04\
427    \x1a\0\x1d\x01\n\x1d\n\x02\x07\0\x12\x03\x1c\x02,\x1a\x12\x20See\x20Rout\
428    ingRule.\n\n\n\n\x03\x07\0\x02\x12\x03\x1a\x07$\n\n\n\x03\x07\0\x06\x12\
429    \x03\x1c\x02\x18\n\n\n\x03\x07\0\x01\x12\x03\x1c\x19\x20\n\n\n\x03\x07\0\
430    \x03\x12\x03\x1c#+\n\xcbN\n\x02\x04\0\x12\x06\x86\x03\0\x8e\x03\x01\x1a\
431    \xbcN\x20Specifies\x20the\x20routing\x20information\x20that\x20should\
432    \x20be\x20sent\x20along\x20with\x20the\x20request\n\x20in\x20the\x20form\
433    \x20of\x20routing\x20header.\n\x20**NOTE:**\x20All\x20service\x20configu\
434    ration\x20rules\x20follow\x20the\x20\"last\x20one\x20wins\"\x20order.\n\
435    \n\x20The\x20examples\x20below\x20will\x20apply\x20to\x20an\x20RPC\x20wh\
436    ich\x20has\x20the\x20following\x20request\x20type:\n\n\x20Message\x20Def\
437    inition:\n\n\x20\x20\x20\x20\x20message\x20Request\x20{\n\x20\x20\x20\
438    \x20\x20\x20\x20//\x20The\x20name\x20of\x20the\x20Table\n\x20\x20\x20\
439    \x20\x20\x20\x20//\x20Values\x20can\x20be\x20of\x20the\x20following\x20f\
440    ormats:\n\x20\x20\x20\x20\x20\x20\x20//\x20-\x20`projects/<project>/tabl\
441    es/<table>`\n\x20\x20\x20\x20\x20\x20\x20//\x20-\x20`projects/<project>/\
442    instances/<instance>/tables/<table>`\n\x20\x20\x20\x20\x20\x20\x20//\x20\
443    -\x20`region/<region>/zones/<zone>/tables/<table>`\n\x20\x20\x20\x20\x20\
444    \x20\x20string\x20table_name\x20=\x201;\n\n\x20\x20\x20\x20\x20\x20\x20/\
445    /\x20This\x20value\x20specifies\x20routing\x20for\x20replication.\n\x20\
446    \x20\x20\x20\x20\x20\x20//\x20It\x20can\x20be\x20in\x20the\x20following\
447    \x20formats:\n\x20\x20\x20\x20\x20\x20\x20//\x20-\x20`profiles/<profile_\
448    id>`\n\x20\x20\x20\x20\x20\x20\x20//\x20-\x20a\x20legacy\x20`profile_id`\
449    \x20that\x20can\x20be\x20any\x20string\n\x20\x20\x20\x20\x20\x20\x20stri\
450    ng\x20app_profile_id\x20=\x202;\n\x20\x20\x20\x20\x20}\n\n\x20Example\
451    \x20message:\n\n\x20\x20\x20\x20\x20{\n\x20\x20\x20\x20\x20\x20\x20table\
452    _name:\x20projects/proj_foo/instances/instance_bar/table/table_baz,\n\
453    \x20\x20\x20\x20\x20\x20\x20app_profile_id:\x20profiles/prof_qux\n\x20\
454    \x20\x20\x20\x20}\n\n\x20The\x20routing\x20header\x20consists\x20of\x20o\
455    ne\x20or\x20multiple\x20key-value\x20pairs.\x20Every\x20key\n\x20and\x20\
456    value\x20must\x20be\x20percent-encoded,\x20and\x20joined\x20together\x20\
457    in\x20the\x20format\x20of\n\x20`key1=value1&key2=value2`.\n\x20In\x20the\
458    \x20examples\x20below\x20I\x20am\x20skipping\x20the\x20percent-encoding\
459    \x20for\x20readablity.\n\n\x20Example\x201\n\n\x20Extracting\x20a\x20fie\
460    ld\x20from\x20the\x20request\x20to\x20put\x20into\x20the\x20routing\x20h\
461    eader\n\x20unchanged,\x20with\x20the\x20key\x20equal\x20to\x20the\x20fie\
462    ld\x20name.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.\
463    api.routing)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20Take\x20the\
464    \x20`app_profile_id`.\n\x20\x20\x20\x20\x20\x20\x20routing_parameters\
465    \x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"app_profile_id\"\
466    \n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\
467    \n\x20\x20\x20\x20\x20x-goog-request-params:\x20app_profile_id=profiles/\
468    prof_qux\n\n\x20Example\x202\n\n\x20Extracting\x20a\x20field\x20from\x20\
469    the\x20request\x20to\x20put\x20into\x20the\x20routing\x20header\n\x20unc\
470    hanged,\x20with\x20the\x20key\x20different\x20from\x20the\x20field\x20na\
471    me.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.rout\
472    ing)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20Take\x20the\x20`app_pr\
473    ofile_id`,\x20but\x20name\x20it\x20`routing_id`\x20in\x20the\x20header.\
474    \n\x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\
475    \x20\x20\x20\x20\x20field:\x20\"app_profile_id\"\n\x20\x20\x20\x20\x20\
476    \x20\x20\x20\x20path_template:\x20\"{routing_id=**}\"\n\x20\x20\x20\x20\
477    \x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\n\x20\x20\x20\x20\
478    \x20x-goog-request-params:\x20routing_id=profiles/prof_qux\n\n\x20Exampl\
479    e\x203\n\n\x20Extracting\x20a\x20field\x20from\x20the\x20request\x20to\
480    \x20put\x20into\x20the\x20routing\n\x20header,\x20while\x20matching\x20a\
481    \x20path\x20template\x20syntax\x20on\x20the\x20field's\x20value.\n\n\x20\
482    NB:\x20it\x20is\x20more\x20useful\x20to\x20send\x20nothing\x20than\x20to\
483    \x20send\x20garbage\x20for\x20the\x20purpose\n\x20of\x20dynamic\x20routi\
484    ng,\x20since\x20garbage\x20pollutes\x20cache.\x20Thus\x20the\x20matching\
485    .\n\n\x20Sub-example\x203a\n\n\x20The\x20field\x20matches\x20the\x20temp\
486    late.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.ro\
487    uting)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20Take\x20the\x20`tabl\
488    e_name`,\x20if\x20it's\x20well-formed\x20(with\x20project-based\n\x20\
489    \x20\x20\x20\x20\x20\x20//\x20syntax).\n\x20\x20\x20\x20\x20\x20\x20rout\
490    ing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"tab\
491    le_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{tabl\
492    e_name=projects/*/instances/*/**}\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\
493    \x20\x20\x20\x20};\n\n\x20result:\n\n\x20\x20\x20\x20\x20x-goog-request-\
494    params:\n\x20\x20\x20\x20\x20table_name=projects/proj_foo/instances/inst\
495    ance_bar/table/table_baz\n\n\x20Sub-example\x203b\n\n\x20The\x20field\
496    \x20does\x20not\x20match\x20the\x20template.\n\n\x20annotation:\n\n\x20\
497    \x20\x20\x20\x20option\x20(google.api.routing)\x20=\x20{\n\x20\x20\x20\
498    \x20\x20\x20\x20//\x20Take\x20the\x20`table_name`,\x20if\x20it's\x20well\
499    -formed\x20(with\x20region-based\n\x20\x20\x20\x20\x20\x20\x20//\x20synt\
500    ax).\n\x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\
501    \x20\x20\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\
502    \x20\x20\x20\x20path_template:\x20\"{table_name=regions/*/zones/*/**}\"\
503    \n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\
504    \n\x20\x20\x20\x20\x20<no\x20routing\x20header\x20will\x20be\x20sent>\n\
505    \n\x20Sub-example\x203c\n\n\x20Multiple\x20alternative\x20conflictingly\
506    \x20named\x20path\x20templates\x20are\n\x20specified.\x20The\x20one\x20t\
507    hat\x20matches\x20is\x20used\x20to\x20construct\x20the\x20header.\n\n\
508    \x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.routing)\
509    \x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20Take\x20the\x20`table_name\
510    `,\x20if\x20it's\x20well-formed,\x20whether\n\x20\x20\x20\x20\x20\x20\
511    \x20//\x20using\x20the\x20region-\x20or\x20projects-based\x20syntax.\n\n\
512    \x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\
513    \x20\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\
514    \x20\x20\x20path_template:\x20\"{table_name=regions/*/zones/*/**}\"\n\
515    \x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\x20routing_param\
516    eters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"table_name\"\
517    \n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{table_name=pr\
518    ojects/*/instances/*/**}\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\
519    \x20\x20};\n\n\x20result:\n\n\x20\x20\x20\x20\x20x-goog-request-params:\
520    \n\x20\x20\x20\x20\x20table_name=projects/proj_foo/instances/instance_ba\
521    r/table/table_baz\n\n\x20Example\x204\n\n\x20Extracting\x20a\x20single\
522    \x20routing\x20header\x20key-value\x20pair\x20by\x20matching\x20a\n\x20t\
523    emplate\x20syntax\x20on\x20(a\x20part\x20of)\x20a\x20single\x20request\
524    \x20field.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.a\
525    pi.routing)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20Take\x20just\
526    \x20the\x20project\x20id\x20from\x20the\x20`table_name`\x20field.\n\x20\
527    \x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\
528    \x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\
529    \x20\x20path_template:\x20\"{routing_id=projects/*}/**\"\n\x20\x20\x20\
530    \x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\n\x20\x20\x20\
531    \x20\x20x-goog-request-params:\x20routing_id=projects/proj_foo\n\n\x20Ex\
532    ample\x205\n\n\x20Extracting\x20a\x20single\x20routing\x20header\x20key-\
533    value\x20pair\x20by\x20matching\n\x20several\x20conflictingly\x20named\
534    \x20path\x20templates\x20on\x20(parts\x20of)\x20a\x20single\x20request\n\
535    \x20field.\x20The\x20last\x20template\x20to\x20match\x20\"wins\"\x20the\
536    \x20conflict.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(googl\
537    e.api.routing)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20If\x20the\
538    \x20`table_name`\x20does\x20not\x20have\x20instances\x20information,\n\
539    \x20\x20\x20\x20\x20\x20\x20//\x20take\x20just\x20the\x20project\x20id\
540    \x20for\x20routing.\n\x20\x20\x20\x20\x20\x20\x20//\x20Otherwise\x20take\
541    \x20project\x20+\x20instance.\n\n\x20\x20\x20\x20\x20\x20\x20routing_par\
542    ameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"table_name\
543    \"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{routing_id=\
544    projects/*}/**\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\
545    \x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20fie\
546    ld:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template\
547    :\x20\"{routing_id=projects/*/instances/*}/**\"\n\x20\x20\x20\x20\x20\
548    \x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\n\x20\x20\x20\x20\x20\
549    x-goog-request-params:\n\x20\x20\x20\x20\x20routing_id=projects/proj_foo\
550    /instances/instance_bar\n\n\x20Example\x206\n\n\x20Extracting\x20multipl\
551    e\x20routing\x20header\x20key-value\x20pairs\x20by\x20matching\n\x20seve\
552    ral\x20non-conflicting\x20path\x20templates\x20on\x20(parts\x20of)\x20a\
553    \x20single\x20request\x20field.\n\n\x20Sub-example\x206a\n\n\x20Make\x20\
554    the\x20templates\x20strict,\x20so\x20that\x20if\x20the\x20`table_name`\
555    \x20does\x20not\n\x20have\x20an\x20instance\x20information,\x20nothing\
556    \x20is\x20sent.\n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(goo\
557    gle.api.routing)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20The\x20rou\
558    ting\x20code\x20needs\x20two\x20keys\x20instead\x20of\x20one\x20composit\
559    e\n\x20\x20\x20\x20\x20\x20\x20//\x20but\x20works\x20only\x20for\x20the\
560    \x20tables\x20with\x20the\x20\"project-instance\"\x20name\n\x20\x20\x20\
561    \x20\x20\x20\x20//\x20syntax.\n\n\x20\x20\x20\x20\x20\x20\x20routing_par\
562    ameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"table_name\
563    \"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{project_id=\
564    projects/*}/instances/*/**\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\
565    \x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\
566    \x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\
567    \x20path_template:\x20\"projects/*/{instance_id=instances/*}/**\"\n\x20\
568    \x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\n\x20\
569    \x20\x20\x20\x20x-goog-request-params:\n\x20\x20\x20\x20\x20project_id=p\
570    rojects/proj_foo&instance_id=instances/instance_bar\n\n\x20Sub-example\
571    \x206b\n\n\x20Make\x20the\x20templates\x20loose,\x20so\x20that\x20if\x20\
572    the\x20`table_name`\x20does\x20not\n\x20have\x20an\x20instance\x20inform\
573    ation,\x20just\x20the\x20project\x20id\x20part\x20is\x20sent.\n\n\x20ann\
574    otation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.routing)\x20=\x20{\
575    \n\x20\x20\x20\x20\x20\x20\x20//\x20The\x20routing\x20code\x20wants\x20t\
576    wo\x20keys\x20instead\x20of\x20one\x20composite\n\x20\x20\x20\x20\x20\
577    \x20\x20//\x20but\x20will\x20work\x20with\x20just\x20the\x20`project_id`\
578    \x20for\x20tables\x20without\n\x20\x20\x20\x20\x20\x20\x20//\x20an\x20in\
579    stance\x20in\x20the\x20`table_name`.\n\n\x20\x20\x20\x20\x20\x20\x20rout\
580    ing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"tab\
581    le_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{proj\
582    ect_id=projects/*}/**\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\
583    \x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\
584    \x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_t\
585    emplate:\x20\"projects/*/{instance_id=instances/*}/**\"\n\x20\x20\x20\
586    \x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result\x20(is\x20the\
587    \x20same\x20as\x206a\x20for\x20our\x20example\x20message\x20because\x20i\
588    t\x20has\x20the\x20instance\n\x20information):\n\n\x20\x20\x20\x20\x20x-\
589    goog-request-params:\n\x20\x20\x20\x20\x20project_id=projects/proj_foo&i\
590    nstance_id=instances/instance_bar\n\n\x20Example\x207\n\n\x20Extracting\
591    \x20multiple\x20routing\x20header\x20key-value\x20pairs\x20by\x20matchin\
592    g\n\x20several\x20path\x20templates\x20on\x20multiple\x20request\x20fiel\
593    ds.\n\n\x20NB:\x20note\x20that\x20here\x20there\x20is\x20no\x20way\x20to\
594    \x20specify\x20sending\x20nothing\x20if\x20one\x20of\x20the\n\x20fields\
595    \x20does\x20not\x20match\x20its\x20template.\x20E.g.\x20if\x20the\x20`ta\
596    ble_name`\x20is\x20in\x20the\x20wrong\n\x20format,\x20the\x20`project_id\
597    `\x20will\x20not\x20be\x20sent,\x20but\x20the\x20`routing_id`\x20will\
598    \x20be.\n\x20The\x20backend\x20routing\x20code\x20has\x20to\x20be\x20awa\
599    re\x20of\x20that\x20and\x20be\x20prepared\x20to\x20not\n\x20receive\x20a\
600    \x20full\x20complement\x20of\x20keys\x20if\x20it\x20expects\x20multiple.\
601    \n\n\x20annotation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.routing\
602    )\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20//\x20The\x20routing\x20needs\
603    \x20both\x20`project_id`\x20and\x20`routing_id`\n\x20\x20\x20\x20\x20\
604    \x20\x20//\x20(from\x20the\x20`app_profile_id`\x20field)\x20for\x20routi\
605    ng.\n\n\x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\
606    \x20\x20\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\
607    \x20\x20\x20\x20path_template:\x20\"{project_id=projects/*}/**\"\n\x20\
608    \x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\x20routing_parameter\
609    s\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"app_profile_id\"\
610    \n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{routing_id=**\
611    }\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result\
612    :\n\n\x20\x20\x20\x20\x20x-goog-request-params:\n\x20\x20\x20\x20\x20pro\
613    ject_id=projects/proj_foo&routing_id=profiles/prof_qux\n\n\x20Example\
614    \x208\n\n\x20Extracting\x20a\x20single\x20routing\x20header\x20key-value\
615    \x20pair\x20by\x20matching\n\x20several\x20conflictingly\x20named\x20pat\
616    h\x20templates\x20on\x20several\x20request\x20fields.\x20The\n\x20last\
617    \x20template\x20to\x20match\x20\"wins\"\x20the\x20conflict.\n\n\x20annot\
618    ation:\n\n\x20\x20\x20\x20\x20option\x20(google.api.routing)\x20=\x20{\n\
619    \x20\x20\x20\x20\x20\x20\x20//\x20The\x20`routing_id`\x20can\x20be\x20a\
620    \x20project\x20id\x20or\x20a\x20region\x20id\x20depending\x20on\n\x20\
621    \x20\x20\x20\x20\x20\x20//\x20the\x20table\x20name\x20format,\x20but\x20\
622    only\x20if\x20the\x20`app_profile_id`\x20is\x20not\x20set.\n\x20\x20\x20\
623    \x20\x20\x20\x20//\x20If\x20`app_profile_id`\x20is\x20set\x20it\x20shoul\
624    d\x20be\x20used\x20instead.\n\n\x20\x20\x20\x20\x20\x20\x20routing_param\
625    eters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"table_name\"\
626    \n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{routing_id=pr\
627    ojects/*}/**\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\
628    \x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20fie\
629    ld:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20path_temp\
630    late:\x20\"{routing_id=regions/*}/**\"\n\x20\x20\x20\x20\x20\x20\x20}\n\
631    \x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\
632    \x20\x20\x20\x20\x20field:\x20\"app_profile_id\"\n\x20\x20\x20\x20\x20\
633    \x20\x20\x20\x20path_template:\x20\"{routing_id=**}\"\n\x20\x20\x20\x20\
634    \x20\x20\x20}\n\x20\x20\x20\x20\x20};\n\n\x20result:\n\n\x20\x20\x20\x20\
635    \x20x-goog-request-params:\x20routing_id=profiles/prof_qux\n\n\x20Exampl\
636    e\x209\n\n\x20Bringing\x20it\x20all\x20together.\n\n\x20annotation:\n\n\
637    \x20\x20\x20\x20\x20option\x20(google.api.routing)\x20=\x20{\n\x20\x20\
638    \x20\x20\x20\x20\x20//\x20For\x20routing\x20both\x20`table_location`\x20\
639    and\x20a\x20`routing_id`\x20are\x20needed.\n\x20\x20\x20\x20\x20\x20\x20\
640    //\n\x20\x20\x20\x20\x20\x20\x20//\x20table_location\x20can\x20be\x20eit\
641    her\x20an\x20instance\x20id\x20or\x20a\x20region+zone\x20id.\n\x20\x20\
642    \x20\x20\x20\x20\x20//\n\x20\x20\x20\x20\x20\x20\x20//\x20For\x20`routin\
643    g_id`,\x20take\x20the\x20value\x20of\x20`app_profile_id`\n\x20\x20\x20\
644    \x20\x20\x20\x20//\x20-\x20If\x20it's\x20in\x20the\x20format\x20`profile\
645    s/<profile_id>`,\x20send\n\x20\x20\x20\x20\x20\x20\x20//\x20just\x20the\
646    \x20`<profile_id>`\x20part.\n\x20\x20\x20\x20\x20\x20\x20//\x20-\x20If\
647    \x20it's\x20any\x20other\x20literal,\x20send\x20it\x20as\x20is.\n\x20\
648    \x20\x20\x20\x20\x20\x20//\x20If\x20the\x20`app_profile_id`\x20is\x20emp\
649    ty,\x20and\x20the\x20`table_name`\x20starts\x20with\n\x20\x20\x20\x20\
650    \x20\x20\x20//\x20the\x20project_id,\x20send\x20that\x20instead.\n\n\x20\
651    \x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\x20\
652    \x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\x20\
653    \x20\x20path_template:\x20\"projects/*/{table_location=instances/*}/tabl\
654    es/*\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\x20routi\
655    ng_parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"tabl\
656    e_name\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{table\
657    _location=regions/*/zones/*}/tables/*\"\n\x20\x20\x20\x20\x20\x20\x20}\n\
658    \x20\x20\x20\x20\x20\x20\x20routing_parameters\x20{\n\x20\x20\x20\x20\
659    \x20\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20\x20\
660    \x20\x20\x20path_template:\x20\"{routing_id=projects/*}/**\"\n\x20\x20\
661    \x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\x20routing_parameters\
662    \x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"app_profile_id\"\
663    \n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{routing_id=**\
664    }\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\x20routing_\
665    parameters\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20field:\x20\"app_pro\
666    file_id\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"profi\
667    les/{routing_id=*}\"\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\
668    \x20};\n\n\x20result:\n\n\x20\x20\x20\x20\x20x-goog-request-params:\n\
669    \x20\x20\x20\x20\x20table_location=instances/instance_bar&routing_id=pro\
670    f_qux\n\n\x0b\n\x03\x04\0\x01\x12\x04\x86\x03\x08\x13\n\xc3\x02\n\x04\
671    \x04\0\x02\0\x12\x04\x8d\x03\x023\x1a\xb4\x02\x20A\x20collection\x20of\
672    \x20Routing\x20Parameter\x20specifications.\n\x20**NOTE:**\x20If\x20mult\
673    iple\x20Routing\x20Parameters\x20describe\x20the\x20same\x20key\n\x20(vi\
674    a\x20the\x20`path_template`\x20field\x20or\x20via\x20the\x20`field`\x20f\
675    ield\x20when\n\x20`path_template`\x20is\x20not\x20provided),\x20\"last\
676    \x20one\x20wins\"\x20rule\n\x20determines\x20which\x20Parameter\x20gets\
677    \x20used.\n\x20See\x20the\x20examples\x20for\x20more\x20details.\n\n\r\n\
678    \x05\x04\0\x02\0\x04\x12\x04\x8d\x03\x02\n\n\r\n\x05\x04\0\x02\0\x06\x12\
679    \x04\x8d\x03\x0b\x1b\n\r\n\x05\x04\0\x02\0\x01\x12\x04\x8d\x03\x1c.\n\r\
680    \n\x05\x04\0\x02\0\x03\x12\x04\x8d\x0312\nN\n\x02\x04\x01\x12\x06\x91\
681    \x03\0\xcc\x03\x01\x1a@\x20A\x20projection\x20from\x20an\x20input\x20mes\
682    sage\x20to\x20the\x20GRPC\x20or\x20REST\x20header.\n\n\x0b\n\x03\x04\x01\
683    \x01\x12\x04\x91\x03\x08\x18\nJ\n\x04\x04\x01\x02\0\x12\x04\x93\x03\x02\
684    \x13\x1a<\x20A\x20request\x20field\x20to\x20extract\x20the\x20header\x20\
685    key-value\x20pair\x20from.\n\n\r\n\x05\x04\x01\x02\0\x05\x12\x04\x93\x03\
686    \x02\x08\n\r\n\x05\x04\x01\x02\0\x01\x12\x04\x93\x03\t\x0e\n\r\n\x05\x04\
687    \x01\x02\0\x03\x12\x04\x93\x03\x11\x12\n\x91\x12\n\x04\x04\x01\x02\x01\
688    \x12\x04\xcb\x03\x02\x1b\x1a\x82\x12\x20A\x20pattern\x20matching\x20the\
689    \x20key-value\x20field.\x20Optional.\n\x20If\x20not\x20specified,\x20the\
690    \x20whole\x20field\x20specified\x20in\x20the\x20`field`\x20field\x20will\
691    \x20be\n\x20taken\x20as\x20value,\x20and\x20its\x20name\x20used\x20as\
692    \x20key.\x20If\x20specified,\x20it\x20MUST\x20contain\n\x20exactly\x20on\
693    e\x20named\x20segment\x20(along\x20with\x20any\x20number\x20of\x20unname\
694    d\x20segments)\x20The\n\x20pattern\x20will\x20be\x20matched\x20over\x20t\
695    he\x20field\x20specified\x20in\x20the\x20`field`\x20field,\x20then\n\x20\
696    if\x20the\x20match\x20is\x20successful:\n\x20-\x20the\x20name\x20of\x20t\
697    he\x20single\x20named\x20segment\x20will\x20be\x20used\x20as\x20a\x20hea\
698    der\x20name,\n\x20-\x20the\x20match\x20value\x20of\x20the\x20segment\x20\
699    will\x20be\x20used\x20as\x20a\x20header\x20value;\n\x20if\x20the\x20matc\
700    h\x20is\x20NOT\x20successful,\x20nothing\x20will\x20be\x20sent.\n\n\x20E\
701    xample:\n\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20-\
702    -\x20This\x20is\x20a\x20field\x20in\x20the\x20request\x20message\n\x20\
703    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\x20\x20\x20that\
704    \x20the\x20header\x20value\x20will\x20be\x20extracted\x20from.\n\x20\x20\
705    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\n\x20\x20\x20\x20\x20\
706    \x20\x20\x20\x20\x20\x20\x20\x20\x20|\x20\x20\x20\x20\x20\x20\x20\x20\
707    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20--\x20This\x20is\x20\
708    the\x20key\x20name\x20in\x20the\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\
709    \x20\x20\x20\x20\x20|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
710    \x20\x20\x20\x20\x20\x20\x20\x20|\x20\x20\x20routing\x20header.\n\x20\
711    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20V\x20\x20\x20\x20\
712    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\n\x20\
713    \x20\x20\x20\x20field:\x20\"table_name\"\x20\x20\x20\x20\x20\x20\x20\x20\
714    \x20\x20\x20v\n\x20\x20\x20\x20\x20path_template:\x20\"projects/*/{table\
715    _location=instances/*}/tables/*\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\
716    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
717    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
718    \x20\x20\x20^\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20^\n\x20\x20\
719    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
720    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
721    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\x20\x20\x20\x20\x20\x20\x20\
722    \x20\x20\x20\x20\x20|\n\x20\x20\x20\x20\x20\x20\x20In\x20the\x20{}\x20br\
723    ackets\x20is\x20the\x20pattern\x20that\x20--\x20\x20\x20\x20\x20\x20\x20\
724    \x20\x20\x20\x20\x20\x20|\n\x20\x20\x20\x20\x20\x20\x20specifies\x20what\
725    \x20to\x20extract\x20from\x20the\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
726    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\n\x20\x20\x20\x20\x20\x20\x20f\
727    ield\x20as\x20a\x20value\x20to\x20be\x20sent.\x20\x20\x20\x20\x20\x20\
728    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
729    \x20\x20|\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
730    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
731    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
732    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20|\n\x20\x20\x20\x20\x20\x20The\
733    \x20string\x20in\x20the\x20field\x20must\x20match\x20the\x20whole\x20pat\
734    tern\x20--\n\x20\x20\x20\x20\x20\x20before\x20brackets,\x20inside\x20bra\
735    ckets,\x20after\x20brackets.\n\n\x20When\x20looking\x20at\x20this\x20spe\
736    cific\x20example,\x20we\x20can\x20see\x20that:\n\x20-\x20A\x20key-value\
737    \x20pair\x20with\x20the\x20key\x20`table_location`\n\x20\x20\x20and\x20t\
738    he\x20value\x20matching\x20`instances/*`\x20should\x20be\x20added\n\x20\
739    \x20\x20to\x20the\x20x-goog-request-params\x20routing\x20header.\n\x20-\
740    \x20The\x20value\x20is\x20extracted\x20from\x20the\x20request\x20message\
741    's\x20`table_name`\x20field\n\x20\x20\x20if\x20it\x20matches\x20the\x20f\
742    ull\x20pattern\x20specified:\n\x20\x20\x20`projects/*/instances/*/tables\
743    /*`.\n\n\x20**NB:**\x20If\x20the\x20`path_template`\x20field\x20is\x20no\
744    t\x20provided,\x20the\x20key\x20name\x20is\n\x20equal\x20to\x20the\x20fi\
745    eld\x20name,\x20and\x20the\x20whole\x20field\x20should\x20be\x20sent\x20\
746    as\x20a\x20value.\n\x20This\x20makes\x20the\x20pattern\x20for\x20the\x20\
747    field\x20and\x20the\x20value\x20functionally\x20equivalent\n\x20to\x20`*\
748    *`,\x20and\x20the\x20configuration\n\n\x20\x20\x20\x20\x20{\n\x20\x20\
749    \x20\x20\x20\x20\x20field:\x20\"table_name\"\n\x20\x20\x20\x20\x20}\n\n\
750    \x20is\x20a\x20functionally\x20equivalent\x20shorthand\x20to:\n\n\x20\
751    \x20\x20\x20\x20{\n\x20\x20\x20\x20\x20\x20\x20field:\x20\"table_name\"\
752    \n\x20\x20\x20\x20\x20\x20\x20path_template:\x20\"{table_name=**}\"\n\
753    \x20\x20\x20\x20\x20}\n\n\x20See\x20Example\x201\x20for\x20more\x20detai\
754    ls.\n\n\r\n\x05\x04\x01\x02\x01\x05\x12\x04\xcb\x03\x02\x08\n\r\n\x05\
755    \x04\x01\x02\x01\x01\x12\x04\xcb\x03\t\x16\n\r\n\x05\x04\x01\x02\x01\x03\
756    \x12\x04\xcb\x03\x19\x1ab\x06proto3\
757";
758
759static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
760
761fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
762    ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
763}
764
765pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
766    file_descriptor_proto_lazy.get(|| {
767        parse_descriptor_proto()
768    })
769}