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