google_cloud_rust_raw/api/
http.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/http.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 Http {
28    // message fields
29    pub rules: ::protobuf::RepeatedField<HttpRule>,
30    pub fully_decode_reserved_expansion: bool,
31    // special fields
32    pub unknown_fields: ::protobuf::UnknownFields,
33    pub cached_size: ::protobuf::CachedSize,
34}
35
36impl<'a> ::std::default::Default for &'a Http {
37    fn default() -> &'a Http {
38        <Http as ::protobuf::Message>::default_instance()
39    }
40}
41
42impl Http {
43    pub fn new() -> Http {
44        ::std::default::Default::default()
45    }
46
47    // repeated .google.api.HttpRule rules = 1;
48
49
50    pub fn get_rules(&self) -> &[HttpRule] {
51        &self.rules
52    }
53    pub fn clear_rules(&mut self) {
54        self.rules.clear();
55    }
56
57    // Param is passed by value, moved
58    pub fn set_rules(&mut self, v: ::protobuf::RepeatedField<HttpRule>) {
59        self.rules = v;
60    }
61
62    // Mutable pointer to the field.
63    pub fn mut_rules(&mut self) -> &mut ::protobuf::RepeatedField<HttpRule> {
64        &mut self.rules
65    }
66
67    // Take field
68    pub fn take_rules(&mut self) -> ::protobuf::RepeatedField<HttpRule> {
69        ::std::mem::replace(&mut self.rules, ::protobuf::RepeatedField::new())
70    }
71
72    // bool fully_decode_reserved_expansion = 2;
73
74
75    pub fn get_fully_decode_reserved_expansion(&self) -> bool {
76        self.fully_decode_reserved_expansion
77    }
78    pub fn clear_fully_decode_reserved_expansion(&mut self) {
79        self.fully_decode_reserved_expansion = false;
80    }
81
82    // Param is passed by value, moved
83    pub fn set_fully_decode_reserved_expansion(&mut self, v: bool) {
84        self.fully_decode_reserved_expansion = v;
85    }
86}
87
88impl ::protobuf::Message for Http {
89    fn is_initialized(&self) -> bool {
90        for v in &self.rules {
91            if !v.is_initialized() {
92                return false;
93            }
94        };
95        true
96    }
97
98    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
99        while !is.eof()? {
100            let (field_number, wire_type) = is.read_tag_unpack()?;
101            match field_number {
102                1 => {
103                    ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.rules)?;
104                },
105                2 => {
106                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
107                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
108                    }
109                    let tmp = is.read_bool()?;
110                    self.fully_decode_reserved_expansion = tmp;
111                },
112                _ => {
113                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
114                },
115            };
116        }
117        ::std::result::Result::Ok(())
118    }
119
120    // Compute sizes of nested messages
121    #[allow(unused_variables)]
122    fn compute_size(&self) -> u32 {
123        let mut my_size = 0;
124        for value in &self.rules {
125            let len = value.compute_size();
126            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
127        };
128        if self.fully_decode_reserved_expansion != false {
129            my_size += 2;
130        }
131        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
132        self.cached_size.set(my_size);
133        my_size
134    }
135
136    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
137        for v in &self.rules {
138            os.write_tag(1, ::protobuf::wire_format::WireTypeLengthDelimited)?;
139            os.write_raw_varint32(v.get_cached_size())?;
140            v.write_to_with_cached_sizes(os)?;
141        };
142        if self.fully_decode_reserved_expansion != false {
143            os.write_bool(2, self.fully_decode_reserved_expansion)?;
144        }
145        os.write_unknown_fields(self.get_unknown_fields())?;
146        ::std::result::Result::Ok(())
147    }
148
149    fn get_cached_size(&self) -> u32 {
150        self.cached_size.get()
151    }
152
153    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
154        &self.unknown_fields
155    }
156
157    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
158        &mut self.unknown_fields
159    }
160
161    fn as_any(&self) -> &dyn (::std::any::Any) {
162        self as &dyn (::std::any::Any)
163    }
164    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
165        self as &mut dyn (::std::any::Any)
166    }
167    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
168        self
169    }
170
171    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
172        Self::descriptor_static()
173    }
174
175    fn new() -> Http {
176        Http::new()
177    }
178
179    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
180        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
181        descriptor.get(|| {
182            let mut fields = ::std::vec::Vec::new();
183            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<HttpRule>>(
184                "rules",
185                |m: &Http| { &m.rules },
186                |m: &mut Http| { &mut m.rules },
187            ));
188            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBool>(
189                "fully_decode_reserved_expansion",
190                |m: &Http| { &m.fully_decode_reserved_expansion },
191                |m: &mut Http| { &mut m.fully_decode_reserved_expansion },
192            ));
193            ::protobuf::reflect::MessageDescriptor::new_pb_name::<Http>(
194                "Http",
195                fields,
196                file_descriptor_proto()
197            )
198        })
199    }
200
201    fn default_instance() -> &'static Http {
202        static instance: ::protobuf::rt::LazyV2<Http> = ::protobuf::rt::LazyV2::INIT;
203        instance.get(Http::new)
204    }
205}
206
207impl ::protobuf::Clear for Http {
208    fn clear(&mut self) {
209        self.rules.clear();
210        self.fully_decode_reserved_expansion = false;
211        self.unknown_fields.clear();
212    }
213}
214
215impl ::std::fmt::Debug for Http {
216    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
217        ::protobuf::text_format::fmt(self, f)
218    }
219}
220
221impl ::protobuf::reflect::ProtobufValue for Http {
222    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
223        ::protobuf::reflect::ReflectValueRef::Message(self)
224    }
225}
226
227#[derive(PartialEq,Clone,Default)]
228pub struct HttpRule {
229    // message fields
230    pub selector: ::std::string::String,
231    pub body: ::std::string::String,
232    pub response_body: ::std::string::String,
233    pub additional_bindings: ::protobuf::RepeatedField<HttpRule>,
234    // message oneof groups
235    pub pattern: ::std::option::Option<HttpRule_oneof_pattern>,
236    // special fields
237    pub unknown_fields: ::protobuf::UnknownFields,
238    pub cached_size: ::protobuf::CachedSize,
239}
240
241impl<'a> ::std::default::Default for &'a HttpRule {
242    fn default() -> &'a HttpRule {
243        <HttpRule as ::protobuf::Message>::default_instance()
244    }
245}
246
247#[derive(Clone,PartialEq,Debug)]
248pub enum HttpRule_oneof_pattern {
249    get(::std::string::String),
250    put(::std::string::String),
251    post(::std::string::String),
252    delete(::std::string::String),
253    patch(::std::string::String),
254    custom(CustomHttpPattern),
255}
256
257impl HttpRule {
258    pub fn new() -> HttpRule {
259        ::std::default::Default::default()
260    }
261
262    // string selector = 1;
263
264
265    pub fn get_selector(&self) -> &str {
266        &self.selector
267    }
268    pub fn clear_selector(&mut self) {
269        self.selector.clear();
270    }
271
272    // Param is passed by value, moved
273    pub fn set_selector(&mut self, v: ::std::string::String) {
274        self.selector = v;
275    }
276
277    // Mutable pointer to the field.
278    // If field is not initialized, it is initialized with default value first.
279    pub fn mut_selector(&mut self) -> &mut ::std::string::String {
280        &mut self.selector
281    }
282
283    // Take field
284    pub fn take_selector(&mut self) -> ::std::string::String {
285        ::std::mem::replace(&mut self.selector, ::std::string::String::new())
286    }
287
288    // string get = 2;
289
290
291    pub fn get_get(&self) -> &str {
292        match self.pattern {
293            ::std::option::Option::Some(HttpRule_oneof_pattern::get(ref v)) => v,
294            _ => "",
295        }
296    }
297    pub fn clear_get(&mut self) {
298        self.pattern = ::std::option::Option::None;
299    }
300
301    pub fn has_get(&self) -> bool {
302        match self.pattern {
303            ::std::option::Option::Some(HttpRule_oneof_pattern::get(..)) => true,
304            _ => false,
305        }
306    }
307
308    // Param is passed by value, moved
309    pub fn set_get(&mut self, v: ::std::string::String) {
310        self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::get(v))
311    }
312
313    // Mutable pointer to the field.
314    pub fn mut_get(&mut self) -> &mut ::std::string::String {
315        if let ::std::option::Option::Some(HttpRule_oneof_pattern::get(_)) = self.pattern {
316        } else {
317            self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::get(::std::string::String::new()));
318        }
319        match self.pattern {
320            ::std::option::Option::Some(HttpRule_oneof_pattern::get(ref mut v)) => v,
321            _ => panic!(),
322        }
323    }
324
325    // Take field
326    pub fn take_get(&mut self) -> ::std::string::String {
327        if self.has_get() {
328            match self.pattern.take() {
329                ::std::option::Option::Some(HttpRule_oneof_pattern::get(v)) => v,
330                _ => panic!(),
331            }
332        } else {
333            ::std::string::String::new()
334        }
335    }
336
337    // string put = 3;
338
339
340    pub fn get_put(&self) -> &str {
341        match self.pattern {
342            ::std::option::Option::Some(HttpRule_oneof_pattern::put(ref v)) => v,
343            _ => "",
344        }
345    }
346    pub fn clear_put(&mut self) {
347        self.pattern = ::std::option::Option::None;
348    }
349
350    pub fn has_put(&self) -> bool {
351        match self.pattern {
352            ::std::option::Option::Some(HttpRule_oneof_pattern::put(..)) => true,
353            _ => false,
354        }
355    }
356
357    // Param is passed by value, moved
358    pub fn set_put(&mut self, v: ::std::string::String) {
359        self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::put(v))
360    }
361
362    // Mutable pointer to the field.
363    pub fn mut_put(&mut self) -> &mut ::std::string::String {
364        if let ::std::option::Option::Some(HttpRule_oneof_pattern::put(_)) = self.pattern {
365        } else {
366            self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::put(::std::string::String::new()));
367        }
368        match self.pattern {
369            ::std::option::Option::Some(HttpRule_oneof_pattern::put(ref mut v)) => v,
370            _ => panic!(),
371        }
372    }
373
374    // Take field
375    pub fn take_put(&mut self) -> ::std::string::String {
376        if self.has_put() {
377            match self.pattern.take() {
378                ::std::option::Option::Some(HttpRule_oneof_pattern::put(v)) => v,
379                _ => panic!(),
380            }
381        } else {
382            ::std::string::String::new()
383        }
384    }
385
386    // string post = 4;
387
388
389    pub fn get_post(&self) -> &str {
390        match self.pattern {
391            ::std::option::Option::Some(HttpRule_oneof_pattern::post(ref v)) => v,
392            _ => "",
393        }
394    }
395    pub fn clear_post(&mut self) {
396        self.pattern = ::std::option::Option::None;
397    }
398
399    pub fn has_post(&self) -> bool {
400        match self.pattern {
401            ::std::option::Option::Some(HttpRule_oneof_pattern::post(..)) => true,
402            _ => false,
403        }
404    }
405
406    // Param is passed by value, moved
407    pub fn set_post(&mut self, v: ::std::string::String) {
408        self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::post(v))
409    }
410
411    // Mutable pointer to the field.
412    pub fn mut_post(&mut self) -> &mut ::std::string::String {
413        if let ::std::option::Option::Some(HttpRule_oneof_pattern::post(_)) = self.pattern {
414        } else {
415            self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::post(::std::string::String::new()));
416        }
417        match self.pattern {
418            ::std::option::Option::Some(HttpRule_oneof_pattern::post(ref mut v)) => v,
419            _ => panic!(),
420        }
421    }
422
423    // Take field
424    pub fn take_post(&mut self) -> ::std::string::String {
425        if self.has_post() {
426            match self.pattern.take() {
427                ::std::option::Option::Some(HttpRule_oneof_pattern::post(v)) => v,
428                _ => panic!(),
429            }
430        } else {
431            ::std::string::String::new()
432        }
433    }
434
435    // string delete = 5;
436
437
438    pub fn get_delete(&self) -> &str {
439        match self.pattern {
440            ::std::option::Option::Some(HttpRule_oneof_pattern::delete(ref v)) => v,
441            _ => "",
442        }
443    }
444    pub fn clear_delete(&mut self) {
445        self.pattern = ::std::option::Option::None;
446    }
447
448    pub fn has_delete(&self) -> bool {
449        match self.pattern {
450            ::std::option::Option::Some(HttpRule_oneof_pattern::delete(..)) => true,
451            _ => false,
452        }
453    }
454
455    // Param is passed by value, moved
456    pub fn set_delete(&mut self, v: ::std::string::String) {
457        self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::delete(v))
458    }
459
460    // Mutable pointer to the field.
461    pub fn mut_delete(&mut self) -> &mut ::std::string::String {
462        if let ::std::option::Option::Some(HttpRule_oneof_pattern::delete(_)) = self.pattern {
463        } else {
464            self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::delete(::std::string::String::new()));
465        }
466        match self.pattern {
467            ::std::option::Option::Some(HttpRule_oneof_pattern::delete(ref mut v)) => v,
468            _ => panic!(),
469        }
470    }
471
472    // Take field
473    pub fn take_delete(&mut self) -> ::std::string::String {
474        if self.has_delete() {
475            match self.pattern.take() {
476                ::std::option::Option::Some(HttpRule_oneof_pattern::delete(v)) => v,
477                _ => panic!(),
478            }
479        } else {
480            ::std::string::String::new()
481        }
482    }
483
484    // string patch = 6;
485
486
487    pub fn get_patch(&self) -> &str {
488        match self.pattern {
489            ::std::option::Option::Some(HttpRule_oneof_pattern::patch(ref v)) => v,
490            _ => "",
491        }
492    }
493    pub fn clear_patch(&mut self) {
494        self.pattern = ::std::option::Option::None;
495    }
496
497    pub fn has_patch(&self) -> bool {
498        match self.pattern {
499            ::std::option::Option::Some(HttpRule_oneof_pattern::patch(..)) => true,
500            _ => false,
501        }
502    }
503
504    // Param is passed by value, moved
505    pub fn set_patch(&mut self, v: ::std::string::String) {
506        self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::patch(v))
507    }
508
509    // Mutable pointer to the field.
510    pub fn mut_patch(&mut self) -> &mut ::std::string::String {
511        if let ::std::option::Option::Some(HttpRule_oneof_pattern::patch(_)) = self.pattern {
512        } else {
513            self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::patch(::std::string::String::new()));
514        }
515        match self.pattern {
516            ::std::option::Option::Some(HttpRule_oneof_pattern::patch(ref mut v)) => v,
517            _ => panic!(),
518        }
519    }
520
521    // Take field
522    pub fn take_patch(&mut self) -> ::std::string::String {
523        if self.has_patch() {
524            match self.pattern.take() {
525                ::std::option::Option::Some(HttpRule_oneof_pattern::patch(v)) => v,
526                _ => panic!(),
527            }
528        } else {
529            ::std::string::String::new()
530        }
531    }
532
533    // .google.api.CustomHttpPattern custom = 8;
534
535
536    pub fn get_custom(&self) -> &CustomHttpPattern {
537        match self.pattern {
538            ::std::option::Option::Some(HttpRule_oneof_pattern::custom(ref v)) => v,
539            _ => <CustomHttpPattern as ::protobuf::Message>::default_instance(),
540        }
541    }
542    pub fn clear_custom(&mut self) {
543        self.pattern = ::std::option::Option::None;
544    }
545
546    pub fn has_custom(&self) -> bool {
547        match self.pattern {
548            ::std::option::Option::Some(HttpRule_oneof_pattern::custom(..)) => true,
549            _ => false,
550        }
551    }
552
553    // Param is passed by value, moved
554    pub fn set_custom(&mut self, v: CustomHttpPattern) {
555        self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::custom(v))
556    }
557
558    // Mutable pointer to the field.
559    pub fn mut_custom(&mut self) -> &mut CustomHttpPattern {
560        if let ::std::option::Option::Some(HttpRule_oneof_pattern::custom(_)) = self.pattern {
561        } else {
562            self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::custom(CustomHttpPattern::new()));
563        }
564        match self.pattern {
565            ::std::option::Option::Some(HttpRule_oneof_pattern::custom(ref mut v)) => v,
566            _ => panic!(),
567        }
568    }
569
570    // Take field
571    pub fn take_custom(&mut self) -> CustomHttpPattern {
572        if self.has_custom() {
573            match self.pattern.take() {
574                ::std::option::Option::Some(HttpRule_oneof_pattern::custom(v)) => v,
575                _ => panic!(),
576            }
577        } else {
578            CustomHttpPattern::new()
579        }
580    }
581
582    // string body = 7;
583
584
585    pub fn get_body(&self) -> &str {
586        &self.body
587    }
588    pub fn clear_body(&mut self) {
589        self.body.clear();
590    }
591
592    // Param is passed by value, moved
593    pub fn set_body(&mut self, v: ::std::string::String) {
594        self.body = v;
595    }
596
597    // Mutable pointer to the field.
598    // If field is not initialized, it is initialized with default value first.
599    pub fn mut_body(&mut self) -> &mut ::std::string::String {
600        &mut self.body
601    }
602
603    // Take field
604    pub fn take_body(&mut self) -> ::std::string::String {
605        ::std::mem::replace(&mut self.body, ::std::string::String::new())
606    }
607
608    // string response_body = 12;
609
610
611    pub fn get_response_body(&self) -> &str {
612        &self.response_body
613    }
614    pub fn clear_response_body(&mut self) {
615        self.response_body.clear();
616    }
617
618    // Param is passed by value, moved
619    pub fn set_response_body(&mut self, v: ::std::string::String) {
620        self.response_body = v;
621    }
622
623    // Mutable pointer to the field.
624    // If field is not initialized, it is initialized with default value first.
625    pub fn mut_response_body(&mut self) -> &mut ::std::string::String {
626        &mut self.response_body
627    }
628
629    // Take field
630    pub fn take_response_body(&mut self) -> ::std::string::String {
631        ::std::mem::replace(&mut self.response_body, ::std::string::String::new())
632    }
633
634    // repeated .google.api.HttpRule additional_bindings = 11;
635
636
637    pub fn get_additional_bindings(&self) -> &[HttpRule] {
638        &self.additional_bindings
639    }
640    pub fn clear_additional_bindings(&mut self) {
641        self.additional_bindings.clear();
642    }
643
644    // Param is passed by value, moved
645    pub fn set_additional_bindings(&mut self, v: ::protobuf::RepeatedField<HttpRule>) {
646        self.additional_bindings = v;
647    }
648
649    // Mutable pointer to the field.
650    pub fn mut_additional_bindings(&mut self) -> &mut ::protobuf::RepeatedField<HttpRule> {
651        &mut self.additional_bindings
652    }
653
654    // Take field
655    pub fn take_additional_bindings(&mut self) -> ::protobuf::RepeatedField<HttpRule> {
656        ::std::mem::replace(&mut self.additional_bindings, ::protobuf::RepeatedField::new())
657    }
658}
659
660impl ::protobuf::Message for HttpRule {
661    fn is_initialized(&self) -> bool {
662        if let Some(HttpRule_oneof_pattern::custom(ref v)) = self.pattern {
663            if !v.is_initialized() {
664                return false;
665            }
666        }
667        for v in &self.additional_bindings {
668            if !v.is_initialized() {
669                return false;
670            }
671        };
672        true
673    }
674
675    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
676        while !is.eof()? {
677            let (field_number, wire_type) = is.read_tag_unpack()?;
678            match field_number {
679                1 => {
680                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.selector)?;
681                },
682                2 => {
683                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
684                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
685                    }
686                    self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::get(is.read_string()?));
687                },
688                3 => {
689                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
690                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
691                    }
692                    self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::put(is.read_string()?));
693                },
694                4 => {
695                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
696                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
697                    }
698                    self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::post(is.read_string()?));
699                },
700                5 => {
701                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
702                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
703                    }
704                    self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::delete(is.read_string()?));
705                },
706                6 => {
707                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
708                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
709                    }
710                    self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::patch(is.read_string()?));
711                },
712                8 => {
713                    if wire_type != ::protobuf::wire_format::WireTypeLengthDelimited {
714                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
715                    }
716                    self.pattern = ::std::option::Option::Some(HttpRule_oneof_pattern::custom(is.read_message()?));
717                },
718                7 => {
719                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.body)?;
720                },
721                12 => {
722                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.response_body)?;
723                },
724                11 => {
725                    ::protobuf::rt::read_repeated_message_into(wire_type, is, &mut self.additional_bindings)?;
726                },
727                _ => {
728                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
729                },
730            };
731        }
732        ::std::result::Result::Ok(())
733    }
734
735    // Compute sizes of nested messages
736    #[allow(unused_variables)]
737    fn compute_size(&self) -> u32 {
738        let mut my_size = 0;
739        if !self.selector.is_empty() {
740            my_size += ::protobuf::rt::string_size(1, &self.selector);
741        }
742        if !self.body.is_empty() {
743            my_size += ::protobuf::rt::string_size(7, &self.body);
744        }
745        if !self.response_body.is_empty() {
746            my_size += ::protobuf::rt::string_size(12, &self.response_body);
747        }
748        for value in &self.additional_bindings {
749            let len = value.compute_size();
750            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
751        };
752        if let ::std::option::Option::Some(ref v) = self.pattern {
753            match v {
754                &HttpRule_oneof_pattern::get(ref v) => {
755                    my_size += ::protobuf::rt::string_size(2, &v);
756                },
757                &HttpRule_oneof_pattern::put(ref v) => {
758                    my_size += ::protobuf::rt::string_size(3, &v);
759                },
760                &HttpRule_oneof_pattern::post(ref v) => {
761                    my_size += ::protobuf::rt::string_size(4, &v);
762                },
763                &HttpRule_oneof_pattern::delete(ref v) => {
764                    my_size += ::protobuf::rt::string_size(5, &v);
765                },
766                &HttpRule_oneof_pattern::patch(ref v) => {
767                    my_size += ::protobuf::rt::string_size(6, &v);
768                },
769                &HttpRule_oneof_pattern::custom(ref v) => {
770                    let len = v.compute_size();
771                    my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
772                },
773            };
774        }
775        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
776        self.cached_size.set(my_size);
777        my_size
778    }
779
780    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
781        if !self.selector.is_empty() {
782            os.write_string(1, &self.selector)?;
783        }
784        if !self.body.is_empty() {
785            os.write_string(7, &self.body)?;
786        }
787        if !self.response_body.is_empty() {
788            os.write_string(12, &self.response_body)?;
789        }
790        for v in &self.additional_bindings {
791            os.write_tag(11, ::protobuf::wire_format::WireTypeLengthDelimited)?;
792            os.write_raw_varint32(v.get_cached_size())?;
793            v.write_to_with_cached_sizes(os)?;
794        };
795        if let ::std::option::Option::Some(ref v) = self.pattern {
796            match v {
797                &HttpRule_oneof_pattern::get(ref v) => {
798                    os.write_string(2, v)?;
799                },
800                &HttpRule_oneof_pattern::put(ref v) => {
801                    os.write_string(3, v)?;
802                },
803                &HttpRule_oneof_pattern::post(ref v) => {
804                    os.write_string(4, v)?;
805                },
806                &HttpRule_oneof_pattern::delete(ref v) => {
807                    os.write_string(5, v)?;
808                },
809                &HttpRule_oneof_pattern::patch(ref v) => {
810                    os.write_string(6, v)?;
811                },
812                &HttpRule_oneof_pattern::custom(ref v) => {
813                    os.write_tag(8, ::protobuf::wire_format::WireTypeLengthDelimited)?;
814                    os.write_raw_varint32(v.get_cached_size())?;
815                    v.write_to_with_cached_sizes(os)?;
816                },
817            };
818        }
819        os.write_unknown_fields(self.get_unknown_fields())?;
820        ::std::result::Result::Ok(())
821    }
822
823    fn get_cached_size(&self) -> u32 {
824        self.cached_size.get()
825    }
826
827    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
828        &self.unknown_fields
829    }
830
831    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
832        &mut self.unknown_fields
833    }
834
835    fn as_any(&self) -> &dyn (::std::any::Any) {
836        self as &dyn (::std::any::Any)
837    }
838    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
839        self as &mut dyn (::std::any::Any)
840    }
841    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
842        self
843    }
844
845    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
846        Self::descriptor_static()
847    }
848
849    fn new() -> HttpRule {
850        HttpRule::new()
851    }
852
853    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
854        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
855        descriptor.get(|| {
856            let mut fields = ::std::vec::Vec::new();
857            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
858                "selector",
859                |m: &HttpRule| { &m.selector },
860                |m: &mut HttpRule| { &mut m.selector },
861            ));
862            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
863                "get",
864                HttpRule::has_get,
865                HttpRule::get_get,
866            ));
867            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
868                "put",
869                HttpRule::has_put,
870                HttpRule::get_put,
871            ));
872            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
873                "post",
874                HttpRule::has_post,
875                HttpRule::get_post,
876            ));
877            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
878                "delete",
879                HttpRule::has_delete,
880                HttpRule::get_delete,
881            ));
882            fields.push(::protobuf::reflect::accessor::make_singular_string_accessor::<_>(
883                "patch",
884                HttpRule::has_patch,
885                HttpRule::get_patch,
886            ));
887            fields.push(::protobuf::reflect::accessor::make_singular_message_accessor::<_, CustomHttpPattern>(
888                "custom",
889                HttpRule::has_custom,
890                HttpRule::get_custom,
891            ));
892            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
893                "body",
894                |m: &HttpRule| { &m.body },
895                |m: &mut HttpRule| { &mut m.body },
896            ));
897            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
898                "response_body",
899                |m: &HttpRule| { &m.response_body },
900                |m: &mut HttpRule| { &mut m.response_body },
901            ));
902            fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<HttpRule>>(
903                "additional_bindings",
904                |m: &HttpRule| { &m.additional_bindings },
905                |m: &mut HttpRule| { &mut m.additional_bindings },
906            ));
907            ::protobuf::reflect::MessageDescriptor::new_pb_name::<HttpRule>(
908                "HttpRule",
909                fields,
910                file_descriptor_proto()
911            )
912        })
913    }
914
915    fn default_instance() -> &'static HttpRule {
916        static instance: ::protobuf::rt::LazyV2<HttpRule> = ::protobuf::rt::LazyV2::INIT;
917        instance.get(HttpRule::new)
918    }
919}
920
921impl ::protobuf::Clear for HttpRule {
922    fn clear(&mut self) {
923        self.selector.clear();
924        self.pattern = ::std::option::Option::None;
925        self.pattern = ::std::option::Option::None;
926        self.pattern = ::std::option::Option::None;
927        self.pattern = ::std::option::Option::None;
928        self.pattern = ::std::option::Option::None;
929        self.pattern = ::std::option::Option::None;
930        self.body.clear();
931        self.response_body.clear();
932        self.additional_bindings.clear();
933        self.unknown_fields.clear();
934    }
935}
936
937impl ::std::fmt::Debug for HttpRule {
938    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
939        ::protobuf::text_format::fmt(self, f)
940    }
941}
942
943impl ::protobuf::reflect::ProtobufValue for HttpRule {
944    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
945        ::protobuf::reflect::ReflectValueRef::Message(self)
946    }
947}
948
949#[derive(PartialEq,Clone,Default)]
950pub struct CustomHttpPattern {
951    // message fields
952    pub kind: ::std::string::String,
953    pub path: ::std::string::String,
954    // special fields
955    pub unknown_fields: ::protobuf::UnknownFields,
956    pub cached_size: ::protobuf::CachedSize,
957}
958
959impl<'a> ::std::default::Default for &'a CustomHttpPattern {
960    fn default() -> &'a CustomHttpPattern {
961        <CustomHttpPattern as ::protobuf::Message>::default_instance()
962    }
963}
964
965impl CustomHttpPattern {
966    pub fn new() -> CustomHttpPattern {
967        ::std::default::Default::default()
968    }
969
970    // string kind = 1;
971
972
973    pub fn get_kind(&self) -> &str {
974        &self.kind
975    }
976    pub fn clear_kind(&mut self) {
977        self.kind.clear();
978    }
979
980    // Param is passed by value, moved
981    pub fn set_kind(&mut self, v: ::std::string::String) {
982        self.kind = v;
983    }
984
985    // Mutable pointer to the field.
986    // If field is not initialized, it is initialized with default value first.
987    pub fn mut_kind(&mut self) -> &mut ::std::string::String {
988        &mut self.kind
989    }
990
991    // Take field
992    pub fn take_kind(&mut self) -> ::std::string::String {
993        ::std::mem::replace(&mut self.kind, ::std::string::String::new())
994    }
995
996    // string path = 2;
997
998
999    pub fn get_path(&self) -> &str {
1000        &self.path
1001    }
1002    pub fn clear_path(&mut self) {
1003        self.path.clear();
1004    }
1005
1006    // Param is passed by value, moved
1007    pub fn set_path(&mut self, v: ::std::string::String) {
1008        self.path = v;
1009    }
1010
1011    // Mutable pointer to the field.
1012    // If field is not initialized, it is initialized with default value first.
1013    pub fn mut_path(&mut self) -> &mut ::std::string::String {
1014        &mut self.path
1015    }
1016
1017    // Take field
1018    pub fn take_path(&mut self) -> ::std::string::String {
1019        ::std::mem::replace(&mut self.path, ::std::string::String::new())
1020    }
1021}
1022
1023impl ::protobuf::Message for CustomHttpPattern {
1024    fn is_initialized(&self) -> bool {
1025        true
1026    }
1027
1028    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::ProtobufResult<()> {
1029        while !is.eof()? {
1030            let (field_number, wire_type) = is.read_tag_unpack()?;
1031            match field_number {
1032                1 => {
1033                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.kind)?;
1034                },
1035                2 => {
1036                    ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.path)?;
1037                },
1038                _ => {
1039                    ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
1040                },
1041            };
1042        }
1043        ::std::result::Result::Ok(())
1044    }
1045
1046    // Compute sizes of nested messages
1047    #[allow(unused_variables)]
1048    fn compute_size(&self) -> u32 {
1049        let mut my_size = 0;
1050        if !self.kind.is_empty() {
1051            my_size += ::protobuf::rt::string_size(1, &self.kind);
1052        }
1053        if !self.path.is_empty() {
1054            my_size += ::protobuf::rt::string_size(2, &self.path);
1055        }
1056        my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
1057        self.cached_size.set(my_size);
1058        my_size
1059    }
1060
1061    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
1062        if !self.kind.is_empty() {
1063            os.write_string(1, &self.kind)?;
1064        }
1065        if !self.path.is_empty() {
1066            os.write_string(2, &self.path)?;
1067        }
1068        os.write_unknown_fields(self.get_unknown_fields())?;
1069        ::std::result::Result::Ok(())
1070    }
1071
1072    fn get_cached_size(&self) -> u32 {
1073        self.cached_size.get()
1074    }
1075
1076    fn get_unknown_fields(&self) -> &::protobuf::UnknownFields {
1077        &self.unknown_fields
1078    }
1079
1080    fn mut_unknown_fields(&mut self) -> &mut ::protobuf::UnknownFields {
1081        &mut self.unknown_fields
1082    }
1083
1084    fn as_any(&self) -> &dyn (::std::any::Any) {
1085        self as &dyn (::std::any::Any)
1086    }
1087    fn as_any_mut(&mut self) -> &mut dyn (::std::any::Any) {
1088        self as &mut dyn (::std::any::Any)
1089    }
1090    fn into_any(self: ::std::boxed::Box<Self>) -> ::std::boxed::Box<dyn (::std::any::Any)> {
1091        self
1092    }
1093
1094    fn descriptor(&self) -> &'static ::protobuf::reflect::MessageDescriptor {
1095        Self::descriptor_static()
1096    }
1097
1098    fn new() -> CustomHttpPattern {
1099        CustomHttpPattern::new()
1100    }
1101
1102    fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
1103        static descriptor: ::protobuf::rt::LazyV2<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::LazyV2::INIT;
1104        descriptor.get(|| {
1105            let mut fields = ::std::vec::Vec::new();
1106            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
1107                "kind",
1108                |m: &CustomHttpPattern| { &m.kind },
1109                |m: &mut CustomHttpPattern| { &mut m.kind },
1110            ));
1111            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeString>(
1112                "path",
1113                |m: &CustomHttpPattern| { &m.path },
1114                |m: &mut CustomHttpPattern| { &mut m.path },
1115            ));
1116            ::protobuf::reflect::MessageDescriptor::new_pb_name::<CustomHttpPattern>(
1117                "CustomHttpPattern",
1118                fields,
1119                file_descriptor_proto()
1120            )
1121        })
1122    }
1123
1124    fn default_instance() -> &'static CustomHttpPattern {
1125        static instance: ::protobuf::rt::LazyV2<CustomHttpPattern> = ::protobuf::rt::LazyV2::INIT;
1126        instance.get(CustomHttpPattern::new)
1127    }
1128}
1129
1130impl ::protobuf::Clear for CustomHttpPattern {
1131    fn clear(&mut self) {
1132        self.kind.clear();
1133        self.path.clear();
1134        self.unknown_fields.clear();
1135    }
1136}
1137
1138impl ::std::fmt::Debug for CustomHttpPattern {
1139    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
1140        ::protobuf::text_format::fmt(self, f)
1141    }
1142}
1143
1144impl ::protobuf::reflect::ProtobufValue for CustomHttpPattern {
1145    fn as_ref(&self) -> ::protobuf::reflect::ReflectValueRef {
1146        ::protobuf::reflect::ReflectValueRef::Message(self)
1147    }
1148}
1149
1150static file_descriptor_proto_data: &'static [u8] = b"\
1151    \n\x15google/api/http.proto\x12\ngoogle.api\"y\n\x04Http\x12*\n\x05rules\
1152    \x18\x01\x20\x03(\x0b2\x14.google.api.HttpRuleR\x05rules\x12E\n\x1ffully\
1153    _decode_reserved_expansion\x18\x02\x20\x01(\x08R\x1cfullyDecodeReservedE\
1154    xpansion\"\xda\x02\n\x08HttpRule\x12\x1a\n\x08selector\x18\x01\x20\x01(\
1155    \tR\x08selector\x12\x12\n\x03get\x18\x02\x20\x01(\tH\0R\x03get\x12\x12\n\
1156    \x03put\x18\x03\x20\x01(\tH\0R\x03put\x12\x14\n\x04post\x18\x04\x20\x01(\
1157    \tH\0R\x04post\x12\x18\n\x06delete\x18\x05\x20\x01(\tH\0R\x06delete\x12\
1158    \x16\n\x05patch\x18\x06\x20\x01(\tH\0R\x05patch\x127\n\x06custom\x18\x08\
1159    \x20\x01(\x0b2\x1d.google.api.CustomHttpPatternH\0R\x06custom\x12\x12\n\
1160    \x04body\x18\x07\x20\x01(\tR\x04body\x12#\n\rresponse_body\x18\x0c\x20\
1161    \x01(\tR\x0cresponseBody\x12E\n\x13additional_bindings\x18\x0b\x20\x03(\
1162    \x0b2\x14.google.api.HttpRuleR\x12additionalBindingsB\t\n\x07pattern\";\
1163    \n\x11CustomHttpPattern\x12\x12\n\x04kind\x18\x01\x20\x01(\tR\x04kind\
1164    \x12\x12\n\x04path\x18\x02\x20\x01(\tR\x04pathBj\n\x0ecom.google.apiB\tH\
1165    ttpProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;ann\
1166    otations\xf8\x01\x01\xa2\x02\x04GAPIJ\xb2s\n\x07\x12\x05\x0e\0\xfa\x02\
1167    \x01\n\xbc\x04\n\x01\x0c\x12\x03\x0e\0\x122\xb1\x04\x20Copyright\x202023\
1168    \x20Google\x20LLC\n\n\x20Licensed\x20under\x20the\x20Apache\x20License,\
1169    \x20Version\x202.0\x20(the\x20\"License\");\n\x20you\x20may\x20not\x20us\
1170    e\x20this\x20file\x20except\x20in\x20compliance\x20with\x20the\x20Licens\
1171    e.\n\x20You\x20may\x20obtain\x20a\x20copy\x20of\x20the\x20License\x20at\
1172    \n\n\x20\x20\x20\x20\x20http://www.apache.org/licenses/LICENSE-2.0\n\n\
1173    \x20Unless\x20required\x20by\x20applicable\x20law\x20or\x20agreed\x20to\
1174    \x20in\x20writing,\x20software\n\x20distributed\x20under\x20the\x20Licen\
1175    se\x20is\x20distributed\x20on\x20an\x20\"AS\x20IS\"\x20BASIS,\n\x20WITHO\
1176    UT\x20WARRANTIES\x20OR\x20CONDITIONS\x20OF\x20ANY\x20KIND,\x20either\x20\
1177    express\x20or\x20implied.\n\x20See\x20the\x20License\x20for\x20the\x20sp\
1178    ecific\x20language\x20governing\x20permissions\x20and\n\x20limitations\
1179    \x20under\x20the\x20License.\n\n\x08\n\x01\x02\x12\x03\x10\0\x13\n\x08\n\
1180    \x01\x08\x12\x03\x12\0\x1f\n\t\n\x02\x08\x1f\x12\x03\x12\0\x1f\n\x08\n\
1181    \x01\x08\x12\x03\x13\0X\n\t\n\x02\x08\x0b\x12\x03\x13\0X\n\x08\n\x01\x08\
1182    \x12\x03\x14\0\"\n\t\n\x02\x08\n\x12\x03\x14\0\"\n\x08\n\x01\x08\x12\x03\
1183    \x15\0*\n\t\n\x02\x08\x08\x12\x03\x15\0*\n\x08\n\x01\x08\x12\x03\x16\0'\
1184    \n\t\n\x02\x08\x01\x12\x03\x16\0'\n\x08\n\x01\x08\x12\x03\x17\0\"\n\t\n\
1185    \x02\x08$\x12\x03\x17\0\"\n\xcd\x01\n\x02\x04\0\x12\x04\x1c\0)\x01\x1a\
1186    \xc0\x01\x20Defines\x20the\x20HTTP\x20configuration\x20for\x20an\x20API\
1187    \x20service.\x20It\x20contains\x20a\x20list\x20of\n\x20[HttpRule][google\
1188    .api.HttpRule],\x20each\x20specifying\x20the\x20mapping\x20of\x20an\x20R\
1189    PC\x20method\n\x20to\x20one\x20or\x20more\x20HTTP\x20REST\x20API\x20meth\
1190    ods.\n\n\n\n\x03\x04\0\x01\x12\x03\x1c\x08\x0c\n\xa2\x01\n\x04\x04\0\x02\
1191    \0\x12\x03\x20\x02\x1e\x1a\x94\x01\x20A\x20list\x20of\x20HTTP\x20configu\
1192    ration\x20rules\x20that\x20apply\x20to\x20individual\x20API\x20methods.\
1193    \n\n\x20**NOTE:**\x20All\x20service\x20configuration\x20rules\x20follow\
1194    \x20\"last\x20one\x20wins\"\x20order.\n\n\x0c\n\x05\x04\0\x02\0\x04\x12\
1195    \x03\x20\x02\n\n\x0c\n\x05\x04\0\x02\0\x06\x12\x03\x20\x0b\x13\n\x0c\n\
1196    \x05\x04\0\x02\0\x01\x12\x03\x20\x14\x19\n\x0c\n\x05\x04\0\x02\0\x03\x12\
1197    \x03\x20\x1c\x1d\n\x94\x02\n\x04\x04\0\x02\x01\x12\x03(\x02+\x1a\x86\x02\
1198    \x20When\x20set\x20to\x20true,\x20URL\x20path\x20parameters\x20will\x20b\
1199    e\x20fully\x20URI-decoded\x20except\x20in\n\x20cases\x20of\x20single\x20\
1200    segment\x20matches\x20in\x20reserved\x20expansion,\x20where\x20\"%2F\"\
1201    \x20will\x20be\n\x20left\x20encoded.\n\n\x20The\x20default\x20behavior\
1202    \x20is\x20to\x20not\x20decode\x20RFC\x206570\x20reserved\x20characters\
1203    \x20in\x20multi\n\x20segment\x20matches.\n\n\x0c\n\x05\x04\0\x02\x01\x05\
1204    \x12\x03(\x02\x06\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x03(\x07&\n\x0c\n\
1205    \x05\x04\0\x02\x01\x03\x12\x03()*\n\xbbS\n\x02\x04\x01\x12\x06\xbb\x02\0\
1206    \xf1\x02\x01\x1a\xacS\x20#\x20gRPC\x20Transcoding\n\n\x20gRPC\x20Transco\
1207    ding\x20is\x20a\x20feature\x20for\x20mapping\x20between\x20a\x20gRPC\x20\
1208    method\x20and\x20one\x20or\n\x20more\x20HTTP\x20REST\x20endpoints.\x20It\
1209    \x20allows\x20developers\x20to\x20build\x20a\x20single\x20API\x20service\
1210    \n\x20that\x20supports\x20both\x20gRPC\x20APIs\x20and\x20REST\x20APIs.\
1211    \x20Many\x20systems,\x20including\x20[Google\n\x20APIs](https://github.c\
1212    om/googleapis/googleapis),\n\x20[Cloud\x20Endpoints](https://cloud.googl\
1213    e.com/endpoints),\x20[gRPC\n\x20Gateway](https://github.com/grpc-ecosyst\
1214    em/grpc-gateway),\n\x20and\x20[Envoy](https://github.com/envoyproxy/envo\
1215    y)\x20proxy\x20support\x20this\x20feature\n\x20and\x20use\x20it\x20for\
1216    \x20large\x20scale\x20production\x20services.\n\n\x20`HttpRule`\x20defin\
1217    es\x20the\x20schema\x20of\x20the\x20gRPC/REST\x20mapping.\x20The\x20mapp\
1218    ing\x20specifies\n\x20how\x20different\x20portions\x20of\x20the\x20gRPC\
1219    \x20request\x20message\x20are\x20mapped\x20to\x20the\x20URL\n\x20path,\
1220    \x20URL\x20query\x20parameters,\x20and\x20HTTP\x20request\x20body.\x20It\
1221    \x20also\x20controls\x20how\x20the\n\x20gRPC\x20response\x20message\x20i\
1222    s\x20mapped\x20to\x20the\x20HTTP\x20response\x20body.\x20`HttpRule`\x20i\
1223    s\n\x20typically\x20specified\x20as\x20an\x20`google.api.http`\x20annota\
1224    tion\x20on\x20the\x20gRPC\x20method.\n\n\x20Each\x20mapping\x20specifies\
1225    \x20a\x20URL\x20path\x20template\x20and\x20an\x20HTTP\x20method.\x20The\
1226    \x20path\n\x20template\x20may\x20refer\x20to\x20one\x20or\x20more\x20fie\
1227    lds\x20in\x20the\x20gRPC\x20request\x20message,\x20as\x20long\n\x20as\
1228    \x20each\x20field\x20is\x20a\x20non-repeated\x20field\x20with\x20a\x20pr\
1229    imitive\x20(non-message)\x20type.\n\x20The\x20path\x20template\x20contro\
1230    ls\x20how\x20fields\x20of\x20the\x20request\x20message\x20are\x20mapped\
1231    \x20to\n\x20the\x20URL\x20path.\n\n\x20Example:\n\n\x20\x20\x20\x20\x20s\
1232    ervice\x20Messaging\x20{\n\x20\x20\x20\x20\x20\x20\x20rpc\x20GetMessage(\
1233    GetMessageRequest)\x20returns\x20(Message)\x20{\n\x20\x20\x20\x20\x20\
1234    \x20\x20\x20\x20option\x20(google.api.http)\x20=\x20{\n\x20\x20\x20\x20\
1235    \x20\x20\x20\x20\x20\x20\x20\x20\x20get:\x20\"/v1/{name=messages/*}\"\n\
1236    \x20\x20\x20\x20\x20\x20\x20\x20\x20};\n\x20\x20\x20\x20\x20\x20\x20}\n\
1237    \x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20message\x20GetMessageRequest\
1238    \x20{\n\x20\x20\x20\x20\x20\x20\x20string\x20name\x20=\x201;\x20//\x20Ma\
1239    pped\x20to\x20URL\x20path.\n\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20m\
1240    essage\x20Message\x20{\n\x20\x20\x20\x20\x20\x20\x20string\x20text\x20=\
1241    \x201;\x20//\x20The\x20resource\x20content.\n\x20\x20\x20\x20\x20}\n\n\
1242    \x20This\x20enables\x20an\x20HTTP\x20REST\x20to\x20gRPC\x20mapping\x20as\
1243    \x20below:\n\n\x20HTTP\x20|\x20gRPC\n\x20-----|-----\n\x20`GET\x20/v1/me\
1244    ssages/123456`\x20\x20|\x20`GetMessage(name:\x20\"messages/123456\")`\n\
1245    \n\x20Any\x20fields\x20in\x20the\x20request\x20message\x20which\x20are\
1246    \x20not\x20bound\x20by\x20the\x20path\x20template\n\x20automatically\x20\
1247    become\x20HTTP\x20query\x20parameters\x20if\x20there\x20is\x20no\x20HTTP\
1248    \x20request\x20body.\n\x20For\x20example:\n\n\x20\x20\x20\x20\x20service\
1249    \x20Messaging\x20{\n\x20\x20\x20\x20\x20\x20\x20rpc\x20GetMessage(GetMes\
1250    sageRequest)\x20returns\x20(Message)\x20{\n\x20\x20\x20\x20\x20\x20\x20\
1251    \x20\x20option\x20(google.api.http)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\
1252    \x20\x20\x20\x20\x20\x20\x20get:\"/v1/messages/{message_id}\"\n\x20\x20\
1253    \x20\x20\x20\x20\x20\x20\x20};\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\
1254    \x20\x20\x20}\n\x20\x20\x20\x20\x20message\x20GetMessageRequest\x20{\n\
1255    \x20\x20\x20\x20\x20\x20\x20message\x20SubMessage\x20{\n\x20\x20\x20\x20\
1256    \x20\x20\x20\x20\x20string\x20subfield\x20=\x201;\n\x20\x20\x20\x20\x20\
1257    \x20\x20}\n\x20\x20\x20\x20\x20\x20\x20string\x20message_id\x20=\x201;\
1258    \x20//\x20Mapped\x20to\x20URL\x20path.\n\x20\x20\x20\x20\x20\x20\x20int6\
1259    4\x20revision\x20=\x202;\x20\x20\x20\x20//\x20Mapped\x20to\x20URL\x20que\
1260    ry\x20parameter\x20`revision`.\n\x20\x20\x20\x20\x20\x20\x20SubMessage\
1261    \x20sub\x20=\x203;\x20\x20\x20\x20//\x20Mapped\x20to\x20URL\x20query\x20\
1262    parameter\x20`sub.subfield`.\n\x20\x20\x20\x20\x20}\n\n\x20This\x20enabl\
1263    es\x20a\x20HTTP\x20JSON\x20to\x20RPC\x20mapping\x20as\x20below:\n\n\x20H\
1264    TTP\x20|\x20gRPC\n\x20-----|-----\n\x20`GET\x20/v1/messages/123456?revis\
1265    ion=2&sub.subfield=foo`\x20|\n\x20`GetMessage(message_id:\x20\"123456\"\
1266    \x20revision:\x202\x20sub:\x20SubMessage(subfield:\n\x20\"foo\"))`\n\n\
1267    \x20Note\x20that\x20fields\x20which\x20are\x20mapped\x20to\x20URL\x20que\
1268    ry\x20parameters\x20must\x20have\x20a\n\x20primitive\x20type\x20or\x20a\
1269    \x20repeated\x20primitive\x20type\x20or\x20a\x20non-repeated\x20message\
1270    \x20type.\n\x20In\x20the\x20case\x20of\x20a\x20repeated\x20type,\x20the\
1271    \x20parameter\x20can\x20be\x20repeated\x20in\x20the\x20URL\n\x20as\x20`.\
1272    ..?param=A&param=B`.\x20In\x20the\x20case\x20of\x20a\x20message\x20type,\
1273    \x20each\x20field\x20of\x20the\n\x20message\x20is\x20mapped\x20to\x20a\
1274    \x20separate\x20parameter,\x20such\x20as\n\x20`...?foo.a=A&foo.b=B&foo.c\
1275    =C`.\n\n\x20For\x20HTTP\x20methods\x20that\x20allow\x20a\x20request\x20b\
1276    ody,\x20the\x20`body`\x20field\n\x20specifies\x20the\x20mapping.\x20Cons\
1277    ider\x20a\x20REST\x20update\x20method\x20on\x20the\n\x20message\x20resou\
1278    rce\x20collection:\n\n\x20\x20\x20\x20\x20service\x20Messaging\x20{\n\
1279    \x20\x20\x20\x20\x20\x20\x20rpc\x20UpdateMessage(UpdateMessageRequest)\
1280    \x20returns\x20(Message)\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20optio\
1281    n\x20(google.api.http)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\
1282    \x20\x20patch:\x20\"/v1/messages/{message_id}\"\n\x20\x20\x20\x20\x20\
1283    \x20\x20\x20\x20\x20\x20body:\x20\"message\"\n\x20\x20\x20\x20\x20\x20\
1284    \x20\x20\x20};\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20}\n\
1285    \x20\x20\x20\x20\x20message\x20UpdateMessageRequest\x20{\n\x20\x20\x20\
1286    \x20\x20\x20\x20string\x20message_id\x20=\x201;\x20//\x20mapped\x20to\
1287    \x20the\x20URL\n\x20\x20\x20\x20\x20\x20\x20Message\x20message\x20=\x202\
1288    ;\x20\x20\x20//\x20mapped\x20to\x20the\x20body\n\x20\x20\x20\x20\x20}\n\
1289    \n\x20The\x20following\x20HTTP\x20JSON\x20to\x20RPC\x20mapping\x20is\x20\
1290    enabled,\x20where\x20the\n\x20representation\x20of\x20the\x20JSON\x20in\
1291    \x20the\x20request\x20body\x20is\x20determined\x20by\n\x20protos\x20JSON\
1292    \x20encoding:\n\n\x20HTTP\x20|\x20gRPC\n\x20-----|-----\n\x20`PATCH\x20/\
1293    v1/messages/123456\x20{\x20\"text\":\x20\"Hi!\"\x20}`\x20|\x20`UpdateMes\
1294    sage(message_id:\n\x20\"123456\"\x20message\x20{\x20text:\x20\"Hi!\"\x20\
1295    })`\n\n\x20The\x20special\x20name\x20`*`\x20can\x20be\x20used\x20in\x20t\
1296    he\x20body\x20mapping\x20to\x20define\x20that\n\x20every\x20field\x20not\
1297    \x20bound\x20by\x20the\x20path\x20template\x20should\x20be\x20mapped\x20\
1298    to\x20the\n\x20request\x20body.\x20\x20This\x20enables\x20the\x20followi\
1299    ng\x20alternative\x20definition\x20of\n\x20the\x20update\x20method:\n\n\
1300    \x20\x20\x20\x20\x20service\x20Messaging\x20{\n\x20\x20\x20\x20\x20\x20\
1301    \x20rpc\x20UpdateMessage(Message)\x20returns\x20(Message)\x20{\n\x20\x20\
1302    \x20\x20\x20\x20\x20\x20\x20option\x20(google.api.http)\x20=\x20{\n\x20\
1303    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20patch:\x20\"/v1/messages/{messag\
1304    e_id}\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20body:\x20\"*\"\n\
1305    \x20\x20\x20\x20\x20\x20\x20\x20\x20};\n\x20\x20\x20\x20\x20\x20\x20}\n\
1306    \x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20message\x20Message\x20{\n\x20\
1307    \x20\x20\x20\x20\x20\x20string\x20message_id\x20=\x201;\n\x20\x20\x20\
1308    \x20\x20\x20\x20string\x20text\x20=\x202;\n\x20\x20\x20\x20\x20}\n\n\n\
1309    \x20The\x20following\x20HTTP\x20JSON\x20to\x20RPC\x20mapping\x20is\x20en\
1310    abled:\n\n\x20HTTP\x20|\x20gRPC\n\x20-----|-----\n\x20`PATCH\x20/v1/mess\
1311    ages/123456\x20{\x20\"text\":\x20\"Hi!\"\x20}`\x20|\x20`UpdateMessage(me\
1312    ssage_id:\n\x20\"123456\"\x20text:\x20\"Hi!\")`\n\n\x20Note\x20that\x20w\
1313    hen\x20using\x20`*`\x20in\x20the\x20body\x20mapping,\x20it\x20is\x20not\
1314    \x20possible\x20to\n\x20have\x20HTTP\x20parameters,\x20as\x20all\x20fiel\
1315    ds\x20not\x20bound\x20by\x20the\x20path\x20end\x20in\n\x20the\x20body.\
1316    \x20This\x20makes\x20this\x20option\x20more\x20rarely\x20used\x20in\x20p\
1317    ractice\x20when\n\x20defining\x20REST\x20APIs.\x20The\x20common\x20usage\
1318    \x20of\x20`*`\x20is\x20in\x20custom\x20methods\n\x20which\x20don't\x20us\
1319    e\x20the\x20URL\x20at\x20all\x20for\x20transferring\x20data.\n\n\x20It\
1320    \x20is\x20possible\x20to\x20define\x20multiple\x20HTTP\x20methods\x20for\
1321    \x20one\x20RPC\x20by\x20using\n\x20the\x20`additional_bindings`\x20optio\
1322    n.\x20Example:\n\n\x20\x20\x20\x20\x20service\x20Messaging\x20{\n\x20\
1323    \x20\x20\x20\x20\x20\x20rpc\x20GetMessage(GetMessageRequest)\x20returns\
1324    \x20(Message)\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20option\x20(googl\
1325    e.api.http)\x20=\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20get:\
1326    \x20\"/v1/messages/{message_id}\"\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\
1327    \x20\x20additional_bindings\x20{\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\
1328    \x20\x20\x20\x20get:\x20\"/v1/users/{user_id}/messages/{message_id}\"\n\
1329    \x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20\x20\
1330    \x20\x20\x20};\n\x20\x20\x20\x20\x20\x20\x20}\n\x20\x20\x20\x20\x20}\n\
1331    \x20\x20\x20\x20\x20message\x20GetMessageRequest\x20{\n\x20\x20\x20\x20\
1332    \x20\x20\x20string\x20message_id\x20=\x201;\n\x20\x20\x20\x20\x20\x20\
1333    \x20string\x20user_id\x20=\x202;\n\x20\x20\x20\x20\x20}\n\n\x20This\x20e\
1334    nables\x20the\x20following\x20two\x20alternative\x20HTTP\x20JSON\x20to\
1335    \x20RPC\x20mappings:\n\n\x20HTTP\x20|\x20gRPC\n\x20-----|-----\n\x20`GET\
1336    \x20/v1/messages/123456`\x20|\x20`GetMessage(message_id:\x20\"123456\")`\
1337    \n\x20`GET\x20/v1/users/me/messages/123456`\x20|\x20`GetMessage(user_id:\
1338    \x20\"me\"\x20message_id:\n\x20\"123456\")`\n\n\x20##\x20Rules\x20for\
1339    \x20HTTP\x20mapping\n\n\x201.\x20Leaf\x20request\x20fields\x20(recursive\
1340    \x20expansion\x20nested\x20messages\x20in\x20the\x20request\n\x20\x20\
1341    \x20\x20message)\x20are\x20classified\x20into\x20three\x20categories:\n\
1342    \x20\x20\x20\x20-\x20Fields\x20referred\x20by\x20the\x20path\x20template\
1343    .\x20They\x20are\x20passed\x20via\x20the\x20URL\x20path.\n\x20\x20\x20\
1344    \x20-\x20Fields\x20referred\x20by\x20the\x20[HttpRule.body][google.api.H\
1345    ttpRule.body].\x20They\n\x20\x20\x20\x20are\x20passed\x20via\x20the\x20H\
1346    TTP\n\x20\x20\x20\x20\x20\x20request\x20body.\n\x20\x20\x20\x20-\x20All\
1347    \x20other\x20fields\x20are\x20passed\x20via\x20the\x20URL\x20query\x20pa\
1348    rameters,\x20and\x20the\n\x20\x20\x20\x20\x20\x20parameter\x20name\x20is\
1349    \x20the\x20field\x20path\x20in\x20the\x20request\x20message.\x20A\x20rep\
1350    eated\n\x20\x20\x20\x20\x20\x20field\x20can\x20be\x20represented\x20as\
1351    \x20multiple\x20query\x20parameters\x20under\x20the\x20same\n\x20\x20\
1352    \x20\x20\x20\x20name.\n\x20\x202.\x20If\x20[HttpRule.body][google.api.Ht\
1353    tpRule.body]\x20is\x20\"*\",\x20there\x20is\x20no\x20URL\n\x20\x20query\
1354    \x20parameter,\x20all\x20fields\n\x20\x20\x20\x20\x20are\x20passed\x20vi\
1355    a\x20URL\x20path\x20and\x20HTTP\x20request\x20body.\n\x20\x203.\x20If\
1356    \x20[HttpRule.body][google.api.HttpRule.body]\x20is\x20omitted,\x20there\
1357    \x20is\x20no\x20HTTP\n\x20\x20request\x20body,\x20all\n\x20\x20\x20\x20\
1358    \x20fields\x20are\x20passed\x20via\x20URL\x20path\x20and\x20URL\x20query\
1359    \x20parameters.\n\n\x20###\x20Path\x20template\x20syntax\n\n\x20\x20\x20\
1360    \x20\x20Template\x20=\x20\"/\"\x20Segments\x20[\x20Verb\x20]\x20;\n\x20\
1361    \x20\x20\x20\x20Segments\x20=\x20Segment\x20{\x20\"/\"\x20Segment\x20}\
1362    \x20;\n\x20\x20\x20\x20\x20Segment\x20\x20=\x20\"*\"\x20|\x20\"**\"\x20|\
1363    \x20LITERAL\x20|\x20Variable\x20;\n\x20\x20\x20\x20\x20Variable\x20=\x20\
1364    \"{\"\x20FieldPath\x20[\x20\"=\"\x20Segments\x20]\x20\"}\"\x20;\n\x20\
1365    \x20\x20\x20\x20FieldPath\x20=\x20IDENT\x20{\x20\".\"\x20IDENT\x20}\x20;\
1366    \n\x20\x20\x20\x20\x20Verb\x20\x20\x20\x20\x20=\x20\":\"\x20LITERAL\x20;\
1367    \n\n\x20The\x20syntax\x20`*`\x20matches\x20a\x20single\x20URL\x20path\
1368    \x20segment.\x20The\x20syntax\x20`**`\x20matches\n\x20zero\x20or\x20more\
1369    \x20URL\x20path\x20segments,\x20which\x20must\x20be\x20the\x20last\x20pa\
1370    rt\x20of\x20the\x20URL\x20path\n\x20except\x20the\x20`Verb`.\n\n\x20The\
1371    \x20syntax\x20`Variable`\x20matches\x20part\x20of\x20the\x20URL\x20path\
1372    \x20as\x20specified\x20by\x20its\n\x20template.\x20A\x20variable\x20temp\
1373    late\x20must\x20not\x20contain\x20other\x20variables.\x20If\x20a\x20vari\
1374    able\n\x20matches\x20a\x20single\x20path\x20segment,\x20its\x20template\
1375    \x20may\x20be\x20omitted,\x20e.g.\x20`{var}`\n\x20is\x20equivalent\x20to\
1376    \x20`{var=*}`.\n\n\x20The\x20syntax\x20`LITERAL`\x20matches\x20literal\
1377    \x20text\x20in\x20the\x20URL\x20path.\x20If\x20the\x20`LITERAL`\n\x20con\
1378    tains\x20any\x20reserved\x20character,\x20such\x20characters\x20should\
1379    \x20be\x20percent-encoded\n\x20before\x20the\x20matching.\n\n\x20If\x20a\
1380    \x20variable\x20contains\x20exactly\x20one\x20path\x20segment,\x20such\
1381    \x20as\x20`\"{var}\"`\x20or\n\x20`\"{var=*}\"`,\x20when\x20such\x20a\x20\
1382    variable\x20is\x20expanded\x20into\x20a\x20URL\x20path\x20on\x20the\x20c\
1383    lient\n\x20side,\x20all\x20characters\x20except\x20`[-_.~0-9a-zA-Z]`\x20\
1384    are\x20percent-encoded.\x20The\n\x20server\x20side\x20does\x20the\x20rev\
1385    erse\x20decoding.\x20Such\x20variables\x20show\x20up\x20in\x20the\n\x20[\
1386    Discovery\n\x20Document](https://developers.google.com/discovery/v1/refe\
1387    rence/apis)\x20as\n\x20`{var}`.\n\n\x20If\x20a\x20variable\x20contains\
1388    \x20multiple\x20path\x20segments,\x20such\x20as\x20`\"{var=foo/*}\"`\n\
1389    \x20or\x20`\"{var=**}\"`,\x20when\x20such\x20a\x20variable\x20is\x20expa\
1390    nded\x20into\x20a\x20URL\x20path\x20on\x20the\n\x20client\x20side,\x20al\
1391    l\x20characters\x20except\x20`[-_.~/0-9a-zA-Z]`\x20are\x20percent-encode\
1392    d.\n\x20The\x20server\x20side\x20does\x20the\x20reverse\x20decoding,\x20\
1393    except\x20\"%2F\"\x20and\x20\"%2f\"\x20are\x20left\n\x20unchanged.\x20Su\
1394    ch\x20variables\x20show\x20up\x20in\x20the\n\x20[Discovery\n\x20Document\
1395    ](https://developers.google.com/discovery/v1/reference/apis)\x20as\n\x20\
1396    `{+var}`.\n\n\x20##\x20Using\x20gRPC\x20API\x20Service\x20Configuration\
1397    \n\n\x20gRPC\x20API\x20Service\x20Configuration\x20(service\x20config)\
1398    \x20is\x20a\x20configuration\x20language\n\x20for\x20configuring\x20a\
1399    \x20gRPC\x20service\x20to\x20become\x20a\x20user-facing\x20product.\x20T\
1400    he\n\x20service\x20config\x20is\x20simply\x20the\x20YAML\x20representati\
1401    on\x20of\x20the\x20`google.api.Service`\n\x20proto\x20message.\n\n\x20As\
1402    \x20an\x20alternative\x20to\x20annotating\x20your\x20proto\x20file,\x20y\
1403    ou\x20can\x20configure\x20gRPC\n\x20transcoding\x20in\x20your\x20service\
1404    \x20config\x20YAML\x20files.\x20You\x20do\x20this\x20by\x20specifying\
1405    \x20a\n\x20`HttpRule`\x20that\x20maps\x20the\x20gRPC\x20method\x20to\x20\
1406    a\x20REST\x20endpoint,\x20achieving\x20the\x20same\n\x20effect\x20as\x20\
1407    the\x20proto\x20annotation.\x20This\x20can\x20be\x20particularly\x20usef\
1408    ul\x20if\x20you\n\x20have\x20a\x20proto\x20that\x20is\x20reused\x20in\
1409    \x20multiple\x20services.\x20Note\x20that\x20any\x20transcoding\n\x20spe\
1410    cified\x20in\x20the\x20service\x20config\x20will\x20override\x20any\x20m\
1411    atching\x20transcoding\n\x20configuration\x20in\x20the\x20proto.\n\n\x20\
1412    Example:\n\n\x20\x20\x20\x20\x20http:\n\x20\x20\x20\x20\x20\x20\x20rules\
1413    :\n\x20\x20\x20\x20\x20\x20\x20\x20\x20#\x20Selects\x20a\x20gRPC\x20meth\
1414    od\x20and\x20applies\x20HttpRule\x20to\x20it.\n\x20\x20\x20\x20\x20\x20\
1415    \x20\x20\x20-\x20selector:\x20example.v1.Messaging.GetMessage\n\x20\x20\
1416    \x20\x20\x20\x20\x20\x20\x20\x20\x20get:\x20/v1/messages/{message_id}/{s\
1417    ub.subfield}\n\n\x20##\x20Special\x20notes\n\n\x20When\x20gRPC\x20Transc\
1418    oding\x20is\x20used\x20to\x20map\x20a\x20gRPC\x20to\x20JSON\x20REST\x20e\
1419    ndpoints,\x20the\n\x20proto\x20to\x20JSON\x20conversion\x20must\x20follo\
1420    w\x20the\x20[proto3\n\x20specification](https://developers.google.com/pr\
1421    otocol-buffers/docs/proto3#json).\n\n\x20While\x20the\x20single\x20segme\
1422    nt\x20variable\x20follows\x20the\x20semantics\x20of\n\x20[RFC\x206570](h\
1423    ttps://tools.ietf.org/html/rfc6570)\x20Section\x203.2.2\x20Simple\x20Str\
1424    ing\n\x20Expansion,\x20the\x20multi\x20segment\x20variable\x20**does\x20\
1425    not**\x20follow\x20RFC\x206570\x20Section\n\x203.2.3\x20Reserved\x20Expa\
1426    nsion.\x20The\x20reason\x20is\x20that\x20the\x20Reserved\x20Expansion\n\
1427    \x20does\x20not\x20expand\x20special\x20characters\x20like\x20`?`\x20and\
1428    \x20`#`,\x20which\x20would\x20lead\n\x20to\x20invalid\x20URLs.\x20As\x20\
1429    the\x20result,\x20gRPC\x20Transcoding\x20uses\x20a\x20custom\x20encoding\
1430    \n\x20for\x20multi\x20segment\x20variables.\n\n\x20The\x20path\x20variab\
1431    les\x20**must\x20not**\x20refer\x20to\x20any\x20repeated\x20or\x20mapped\
1432    \x20field,\n\x20because\x20client\x20libraries\x20are\x20not\x20capable\
1433    \x20of\x20handling\x20such\x20variable\x20expansion.\n\n\x20The\x20path\
1434    \x20variables\x20**must\x20not**\x20capture\x20the\x20leading\x20\"/\"\
1435    \x20character.\x20The\x20reason\n\x20is\x20that\x20the\x20most\x20common\
1436    \x20use\x20case\x20\"{var}\"\x20does\x20not\x20capture\x20the\x20leading\
1437    \x20\"/\"\n\x20character.\x20For\x20consistency,\x20all\x20path\x20varia\
1438    bles\x20must\x20share\x20the\x20same\x20behavior.\n\n\x20Repeated\x20mes\
1439    sage\x20fields\x20must\x20not\x20be\x20mapped\x20to\x20URL\x20query\x20p\
1440    arameters,\x20because\n\x20no\x20client\x20library\x20can\x20support\x20\
1441    such\x20complicated\x20mapping.\n\n\x20If\x20an\x20API\x20needs\x20to\
1442    \x20use\x20a\x20JSON\x20array\x20for\x20request\x20or\x20response\x20bod\
1443    y,\x20it\x20can\x20map\n\x20the\x20request\x20or\x20response\x20body\x20\
1444    to\x20a\x20repeated\x20field.\x20However,\x20some\x20gRPC\n\x20Transcodi\
1445    ng\x20implementations\x20may\x20not\x20support\x20this\x20feature.\n\n\
1446    \x0b\n\x03\x04\x01\x01\x12\x04\xbb\x02\x08\x10\n\x8f\x01\n\x04\x04\x01\
1447    \x02\0\x12\x04\xc0\x02\x02\x16\x1a\x80\x01\x20Selects\x20a\x20method\x20\
1448    to\x20which\x20this\x20rule\x20applies.\n\n\x20Refer\x20to\x20[selector]\
1449    [google.api.DocumentationRule.selector]\x20for\x20syntax\n\x20details.\n\
1450    \n\r\n\x05\x04\x01\x02\0\x05\x12\x04\xc0\x02\x02\x08\n\r\n\x05\x04\x01\
1451    \x02\0\x01\x12\x04\xc0\x02\t\x11\n\r\n\x05\x04\x01\x02\0\x03\x12\x04\xc0\
1452    \x02\x14\x15\n\xd0\x01\n\x04\x04\x01\x08\0\x12\x06\xc5\x02\x02\xdb\x02\
1453    \x03\x1a\xbf\x01\x20Determines\x20the\x20URL\x20pattern\x20is\x20matched\
1454    \x20by\x20this\x20rules.\x20This\x20pattern\x20can\x20be\n\x20used\x20wi\
1455    th\x20any\x20of\x20the\x20{get|put|post|delete|patch}\x20methods.\x20A\
1456    \x20custom\x20method\n\x20can\x20be\x20defined\x20using\x20the\x20'custo\
1457    m'\x20field.\n\n\r\n\x05\x04\x01\x08\0\x01\x12\x04\xc5\x02\x08\x0f\n\\\n\
1458    \x04\x04\x01\x02\x01\x12\x04\xc8\x02\x04\x13\x1aN\x20Maps\x20to\x20HTTP\
1459    \x20GET.\x20Used\x20for\x20listing\x20and\x20getting\x20information\x20a\
1460    bout\n\x20resources.\n\n\r\n\x05\x04\x01\x02\x01\x05\x12\x04\xc8\x02\x04\
1461    \n\n\r\n\x05\x04\x01\x02\x01\x01\x12\x04\xc8\x02\x0b\x0e\n\r\n\x05\x04\
1462    \x01\x02\x01\x03\x12\x04\xc8\x02\x11\x12\n@\n\x04\x04\x01\x02\x02\x12\
1463    \x04\xcb\x02\x04\x13\x1a2\x20Maps\x20to\x20HTTP\x20PUT.\x20Used\x20for\
1464    \x20replacing\x20a\x20resource.\n\n\r\n\x05\x04\x01\x02\x02\x05\x12\x04\
1465    \xcb\x02\x04\n\n\r\n\x05\x04\x01\x02\x02\x01\x12\x04\xcb\x02\x0b\x0e\n\r\
1466    \n\x05\x04\x01\x02\x02\x03\x12\x04\xcb\x02\x11\x12\nX\n\x04\x04\x01\x02\
1467    \x03\x12\x04\xce\x02\x04\x14\x1aJ\x20Maps\x20to\x20HTTP\x20POST.\x20Used\
1468    \x20for\x20creating\x20a\x20resource\x20or\x20performing\x20an\x20action\
1469    .\n\n\r\n\x05\x04\x01\x02\x03\x05\x12\x04\xce\x02\x04\n\n\r\n\x05\x04\
1470    \x01\x02\x03\x01\x12\x04\xce\x02\x0b\x0f\n\r\n\x05\x04\x01\x02\x03\x03\
1471    \x12\x04\xce\x02\x12\x13\nB\n\x04\x04\x01\x02\x04\x12\x04\xd1\x02\x04\
1472    \x16\x1a4\x20Maps\x20to\x20HTTP\x20DELETE.\x20Used\x20for\x20deleting\
1473    \x20a\x20resource.\n\n\r\n\x05\x04\x01\x02\x04\x05\x12\x04\xd1\x02\x04\n\
1474    \n\r\n\x05\x04\x01\x02\x04\x01\x12\x04\xd1\x02\x0b\x11\n\r\n\x05\x04\x01\
1475    \x02\x04\x03\x12\x04\xd1\x02\x14\x15\nA\n\x04\x04\x01\x02\x05\x12\x04\
1476    \xd4\x02\x04\x15\x1a3\x20Maps\x20to\x20HTTP\x20PATCH.\x20Used\x20for\x20\
1477    updating\x20a\x20resource.\n\n\r\n\x05\x04\x01\x02\x05\x05\x12\x04\xd4\
1478    \x02\x04\n\n\r\n\x05\x04\x01\x02\x05\x01\x12\x04\xd4\x02\x0b\x10\n\r\n\
1479    \x05\x04\x01\x02\x05\x03\x12\x04\xd4\x02\x13\x14\n\x98\x02\n\x04\x04\x01\
1480    \x02\x06\x12\x04\xda\x02\x04!\x1a\x89\x02\x20The\x20custom\x20pattern\
1481    \x20is\x20used\x20for\x20specifying\x20an\x20HTTP\x20method\x20that\x20i\
1482    s\x20not\n\x20included\x20in\x20the\x20`pattern`\x20field,\x20such\x20as\
1483    \x20HEAD,\x20or\x20\"*\"\x20to\x20leave\x20the\n\x20HTTP\x20method\x20un\
1484    specified\x20for\x20this\x20rule.\x20The\x20wild-card\x20rule\x20is\x20u\
1485    seful\n\x20for\x20services\x20that\x20provide\x20content\x20to\x20Web\
1486    \x20(HTML)\x20clients.\n\n\r\n\x05\x04\x01\x02\x06\x06\x12\x04\xda\x02\
1487    \x04\x15\n\r\n\x05\x04\x01\x02\x06\x01\x12\x04\xda\x02\x16\x1c\n\r\n\x05\
1488    \x04\x01\x02\x06\x03\x12\x04\xda\x02\x1f\x20\n\xc4\x02\n\x04\x04\x01\x02\
1489    \x07\x12\x04\xe3\x02\x02\x12\x1a\xb5\x02\x20The\x20name\x20of\x20the\x20\
1490    request\x20field\x20whose\x20value\x20is\x20mapped\x20to\x20the\x20HTTP\
1491    \x20request\n\x20body,\x20or\x20`*`\x20for\x20mapping\x20all\x20request\
1492    \x20fields\x20not\x20captured\x20by\x20the\x20path\n\x20pattern\x20to\
1493    \x20the\x20HTTP\x20body,\x20or\x20omitted\x20for\x20not\x20having\x20any\
1494    \x20HTTP\x20request\x20body.\n\n\x20NOTE:\x20the\x20referred\x20field\
1495    \x20must\x20be\x20present\x20at\x20the\x20top-level\x20of\x20the\x20requ\
1496    est\n\x20message\x20type.\n\n\r\n\x05\x04\x01\x02\x07\x05\x12\x04\xe3\
1497    \x02\x02\x08\n\r\n\x05\x04\x01\x02\x07\x01\x12\x04\xe3\x02\t\r\n\r\n\x05\
1498    \x04\x01\x02\x07\x03\x12\x04\xe3\x02\x10\x11\n\x99\x02\n\x04\x04\x01\x02\
1499    \x08\x12\x04\xeb\x02\x02\x1c\x1a\x8a\x02\x20Optional.\x20The\x20name\x20\
1500    of\x20the\x20response\x20field\x20whose\x20value\x20is\x20mapped\x20to\
1501    \x20the\x20HTTP\n\x20response\x20body.\x20When\x20omitted,\x20the\x20ent\
1502    ire\x20response\x20message\x20will\x20be\x20used\n\x20as\x20the\x20HTTP\
1503    \x20response\x20body.\n\n\x20NOTE:\x20The\x20referred\x20field\x20must\
1504    \x20be\x20present\x20at\x20the\x20top-level\x20of\x20the\x20response\n\
1505    \x20message\x20type.\n\n\r\n\x05\x04\x01\x02\x08\x05\x12\x04\xeb\x02\x02\
1506    \x08\n\r\n\x05\x04\x01\x02\x08\x01\x12\x04\xeb\x02\t\x16\n\r\n\x05\x04\
1507    \x01\x02\x08\x03\x12\x04\xeb\x02\x19\x1b\n\xbb\x01\n\x04\x04\x01\x02\t\
1508    \x12\x04\xf0\x02\x02-\x1a\xac\x01\x20Additional\x20HTTP\x20bindings\x20f\
1509    or\x20the\x20selector.\x20Nested\x20bindings\x20must\n\x20not\x20contain\
1510    \x20an\x20`additional_bindings`\x20field\x20themselves\x20(that\x20is,\n\
1511    \x20the\x20nesting\x20may\x20only\x20be\x20one\x20level\x20deep).\n\n\r\
1512    \n\x05\x04\x01\x02\t\x04\x12\x04\xf0\x02\x02\n\n\r\n\x05\x04\x01\x02\t\
1513    \x06\x12\x04\xf0\x02\x0b\x13\n\r\n\x05\x04\x01\x02\t\x01\x12\x04\xf0\x02\
1514    \x14'\n\r\n\x05\x04\x01\x02\t\x03\x12\x04\xf0\x02*,\nG\n\x02\x04\x02\x12\
1515    \x06\xf4\x02\0\xfa\x02\x01\x1a9\x20A\x20custom\x20pattern\x20is\x20used\
1516    \x20for\x20defining\x20custom\x20HTTP\x20verb.\n\n\x0b\n\x03\x04\x02\x01\
1517    \x12\x04\xf4\x02\x08\x19\n2\n\x04\x04\x02\x02\0\x12\x04\xf6\x02\x02\x12\
1518    \x1a$\x20The\x20name\x20of\x20this\x20custom\x20HTTP\x20verb.\n\n\r\n\
1519    \x05\x04\x02\x02\0\x05\x12\x04\xf6\x02\x02\x08\n\r\n\x05\x04\x02\x02\0\
1520    \x01\x12\x04\xf6\x02\t\r\n\r\n\x05\x04\x02\x02\0\x03\x12\x04\xf6\x02\x10\
1521    \x11\n5\n\x04\x04\x02\x02\x01\x12\x04\xf9\x02\x02\x12\x1a'\x20The\x20pat\
1522    h\x20matched\x20by\x20this\x20custom\x20verb.\n\n\r\n\x05\x04\x02\x02\
1523    \x01\x05\x12\x04\xf9\x02\x02\x08\n\r\n\x05\x04\x02\x02\x01\x01\x12\x04\
1524    \xf9\x02\t\r\n\r\n\x05\x04\x02\x02\x01\x03\x12\x04\xf9\x02\x10\x11b\x06p\
1525    roto3\
1526";
1527
1528static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;
1529
1530fn parse_descriptor_proto() -> ::protobuf::descriptor::FileDescriptorProto {
1531    ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
1532}
1533
1534pub fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
1535    file_descriptor_proto_lazy.get(|| {
1536        parse_descriptor_proto()
1537    })
1538}