protobuf/reflect/service/
mod.rs
1use crate::descriptor::MethodDescriptorProto;
2use crate::descriptor::ServiceDescriptorProto;
3use crate::reflect::service::index::MethodIndex;
4use crate::reflect::service::index::ServiceIndex;
5use crate::reflect::FileDescriptor;
6use crate::reflect::MessageDescriptor;
7
8pub(crate) mod index;
9
10#[derive(Clone, Eq, PartialEq)]
17pub struct ServiceDescriptor {
18 file_descriptor: FileDescriptor,
19 index: usize,
20}
21
22impl ServiceDescriptor {
23 pub(crate) fn new(file_descriptor: FileDescriptor, index: usize) -> ServiceDescriptor {
24 ServiceDescriptor {
25 file_descriptor,
26 index,
27 }
28 }
29
30 fn index(&self) -> &ServiceIndex {
31 &self.file_descriptor.common().services[self.index]
32 }
33
34 pub fn proto(&self) -> &ServiceDescriptorProto {
36 &self.file_descriptor.proto().service[self.index]
37 }
38
39 pub fn methods(&self) -> impl Iterator<Item = MethodDescriptor> + '_ {
41 let value_len = self.proto().method.len();
42 (0..value_len).map(move |index| MethodDescriptor {
43 service_descriptor: self.clone(),
44 index,
45 })
46 }
47}
48
49pub struct MethodDescriptor {
51 service_descriptor: ServiceDescriptor,
52 index: usize,
53}
54
55impl MethodDescriptor {
56 fn index(&self) -> &MethodIndex {
57 &self.service_descriptor.index().methods[self.index]
58 }
59
60 pub fn proto(&self) -> &MethodDescriptorProto {
62 &self.service_descriptor.proto().method[self.index]
63 }
64
65 pub fn input_type(&self) -> MessageDescriptor {
67 self.index()
68 .input_type
69 .resolve_message(&self.service_descriptor.file_descriptor)
70 }
71
72 pub fn output_type(&self) -> MessageDescriptor {
74 self.index()
75 .output_type
76 .resolve_message(&self.service_descriptor.file_descriptor)
77 }
78}