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/// 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)]
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    /// Proto snippet describing this service.
35    pub fn proto(&self) -> &ServiceDescriptorProto {
36        &self.file_descriptor.proto().service[self.index]
37    }
38
39    /// Method descriptors of this service.
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.
50pub 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    /// Proto snippet describing this method.
61    pub fn proto(&self) -> &MethodDescriptorProto {
62        &self.service_descriptor.proto().method[self.index]
63    }
64
65    /// Method input type.
66    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.
73    pub fn output_type(&self) -> MessageDescriptor {
74        self.index()
75            .output_type
76            .resolve_message(&self.service_descriptor.file_descriptor)
77    }
78}