1 use crate::descriptor::MethodDescriptorProto;
2 use crate::descriptor::ServiceDescriptorProto;
3 use crate::reflect::service::index::MethodIndex;
4 use crate::reflect::service::index::ServiceIndex;
5 use crate::reflect::FileDescriptor;
6 use crate::reflect::MessageDescriptor;
7 
8 pub(crate) mod index;
9 
10 /// Dynamic representation of service type.
11 ///
12 /// Rust-protobuf does not support services (it is not an RPC library),
13 /// but it support querying service description. Which might be useful
14 /// for example to generate source files for the services.
15 /// or to perform invocations dynamically.
16 #[derive(Clone, Eq, PartialEq)]
17 pub struct ServiceDescriptor {
18     file_descriptor: FileDescriptor,
19     index: usize,
20 }
21 
22 impl ServiceDescriptor {
new(file_descriptor: FileDescriptor, index: usize) -> ServiceDescriptor23     pub(crate) fn new(file_descriptor: FileDescriptor, index: usize) -> ServiceDescriptor {
24         ServiceDescriptor {
25             file_descriptor,
26             index,
27         }
28     }
29 
index(&self) -> &ServiceIndex30     fn index(&self) -> &ServiceIndex {
31         &self.file_descriptor.common().services[self.index]
32     }
33 
34     /// Proto snippet describing this service.
proto(&self) -> &ServiceDescriptorProto35     pub fn proto(&self) -> &ServiceDescriptorProto {
36         &self.file_descriptor.proto().service[self.index]
37     }
38 
39     /// Method descriptors of this service.
methods(&self) -> impl Iterator<Item = MethodDescriptor> + '_40     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 
49 /// Service method descriptor.
50 pub struct MethodDescriptor {
51     service_descriptor: ServiceDescriptor,
52     index: usize,
53 }
54 
55 impl MethodDescriptor {
index(&self) -> &MethodIndex56     fn index(&self) -> &MethodIndex {
57         &self.service_descriptor.index().methods[self.index]
58     }
59 
60     /// Proto snippet describing this method.
proto(&self) -> &MethodDescriptorProto61     pub fn proto(&self) -> &MethodDescriptorProto {
62         &self.service_descriptor.proto().method[self.index]
63     }
64 
65     /// Method input type.
input_type(&self) -> MessageDescriptor66     pub fn input_type(&self) -> MessageDescriptor {
67         self.index()
68             .input_type
69             .resolve_message(&self.service_descriptor.file_descriptor)
70     }
71 
72     /// Method output type.
output_type(&self) -> MessageDescriptor73     pub fn output_type(&self) -> MessageDescriptor {
74         self.index()
75             .output_type
76             .resolve_message(&self.service_descriptor.file_descriptor)
77     }
78 }
79