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