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