1 use protobuf::reflect::EnumDescriptor;
2 use protobuf::reflect::MessageDescriptor;
3
4 use crate::gen::code_writer::CodeWriter;
5 use crate::gen::file_descriptor::file_descriptor_call_expr;
6 use crate::gen::inside::protobuf_crate_path;
7 use crate::gen::scope::Scope;
8 use crate::Customize;
9
10 /// Abstract message or enum descriptor.
11 pub(crate) trait Descriptor {
12 const DESCRIPTOR_FN: &'static str;
13 const TYPE_NAME: &'static str;
14 const GET_BY_RELATIVE_NAME_NAME: &'static str;
name_to_package(&self) -> &str15 fn name_to_package(&self) -> &str;
16 }
17
18 impl Descriptor for MessageDescriptor {
19 const DESCRIPTOR_FN: &'static str = "descriptor";
20 const TYPE_NAME: &'static str = "MessageDescriptor";
21 const GET_BY_RELATIVE_NAME_NAME: &'static str = "message_by_package_relative_name";
22
name_to_package(&self) -> &str23 fn name_to_package(&self) -> &str {
24 self.name_to_package()
25 }
26 }
27
28 impl Descriptor for EnumDescriptor {
29 const DESCRIPTOR_FN: &'static str = "enum_descriptor";
30 const TYPE_NAME: &'static str = "EnumDescriptor";
31 const GET_BY_RELATIVE_NAME_NAME: &'static str = "enum_by_package_relative_name";
32
name_to_package(&self) -> &str33 fn name_to_package(&self) -> &str {
34 self.name_to_package()
35 }
36 }
37
write_fn_descriptor<D: Descriptor>( descriptor: &D, scope: &Scope, customize: &Customize, w: &mut CodeWriter, )38 pub(crate) fn write_fn_descriptor<D: Descriptor>(
39 descriptor: &D,
40 scope: &Scope,
41 customize: &Customize,
42 w: &mut CodeWriter,
43 ) {
44 let sig = format!(
45 "{}() -> {}::reflect::{}",
46 D::DESCRIPTOR_FN,
47 protobuf_crate_path(customize),
48 D::TYPE_NAME,
49 );
50 w.def_fn(&sig, |w| {
51 let expr = format!(
52 "{}.{}(\"{}\").unwrap()",
53 file_descriptor_call_expr(scope),
54 D::GET_BY_RELATIVE_NAME_NAME,
55 descriptor.name_to_package()
56 );
57 w.lazy_static(
58 "descriptor",
59 &format!(
60 "{}::reflect::{}",
61 protobuf_crate_path(customize),
62 D::TYPE_NAME,
63 ),
64 &protobuf_crate_path(customize).to_string(),
65 );
66 w.write_line(&format!("descriptor.get(|| {}).clone()", expr));
67 });
68 }
69