1 use std::fmt;
2 
3 use protobuf::reflect::EnumDescriptor;
4 use protobuf::reflect::FieldDescriptor;
5 use protobuf::reflect::FileDescriptor;
6 use protobuf::reflect::MessageDescriptor;
7 use protobuf::reflect::OneofDescriptor;
8 
9 use crate::customize::CustomizeCallback;
10 use crate::Customize;
11 
12 #[derive(Clone)]
13 pub(crate) struct CustomizeElemCtx<'a> {
14     pub(crate) for_elem: Customize,
15     pub(crate) for_children: Customize,
16     pub(crate) callback: &'a dyn CustomizeCallback,
17 }
18 
19 impl<'a> fmt::Debug for CustomizeElemCtx<'a> {
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result20     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
21         f.debug_struct("CustomizeElemCtx")
22             .field("for_elem", &self.for_elem)
23             .field("for_children", &self.for_children)
24             .finish_non_exhaustive()
25     }
26 }
27 
28 impl<'a> CustomizeElemCtx<'a> {
child( &self, elem_from_rustproto: &Customize, elem_descriptor: &impl DescriptorForCustomize, ) -> CustomizeElemCtx<'a>29     pub(crate) fn child(
30         &self,
31         elem_from_rustproto: &Customize,
32         elem_descriptor: &impl DescriptorForCustomize,
33     ) -> CustomizeElemCtx<'a> {
34         let mut for_elem = self.for_children.clone();
35         for_elem.update_with(elem_from_rustproto);
36 
37         let for_children = for_elem.clone();
38 
39         for_elem.update_with(&elem_descriptor.customize(self.callback));
40 
41         CustomizeElemCtx {
42             for_elem,
43             for_children,
44             callback: self.callback,
45         }
46     }
47 }
48 
49 pub(crate) trait DescriptorForCustomize {
customize(&self, callback: &dyn CustomizeCallback) -> Customize50     fn customize(&self, callback: &dyn CustomizeCallback) -> Customize;
51 }
52 
53 impl DescriptorForCustomize for MessageDescriptor {
customize(&self, callback: &dyn CustomizeCallback) -> Customize54     fn customize(&self, callback: &dyn CustomizeCallback) -> Customize {
55         callback.message(self)
56     }
57 }
58 
59 impl DescriptorForCustomize for FieldDescriptor {
customize(&self, callback: &dyn CustomizeCallback) -> Customize60     fn customize(&self, callback: &dyn CustomizeCallback) -> Customize {
61         callback.field(self)
62     }
63 }
64 
65 impl DescriptorForCustomize for EnumDescriptor {
customize(&self, callback: &dyn CustomizeCallback) -> Customize66     fn customize(&self, callback: &dyn CustomizeCallback) -> Customize {
67         callback.enumeration(self)
68     }
69 }
70 
71 impl DescriptorForCustomize for OneofDescriptor {
customize(&self, callback: &dyn CustomizeCallback) -> Customize72     fn customize(&self, callback: &dyn CustomizeCallback) -> Customize {
73         callback.oneof(self)
74     }
75 }
76 
77 impl DescriptorForCustomize for FileDescriptor {
customize(&self, callback: &dyn CustomizeCallback) -> Customize78     fn customize(&self, callback: &dyn CustomizeCallback) -> Customize {
79         callback.file(self)
80     }
81 }
82 
83 pub(crate) struct SpecialFieldPseudoDescriptor<'a> {
84     pub(crate) message: &'a MessageDescriptor,
85     pub(crate) field: &'a str,
86 }
87 
88 impl<'a> DescriptorForCustomize for SpecialFieldPseudoDescriptor<'a> {
customize(&self, callback: &dyn CustomizeCallback) -> Customize89     fn customize(&self, callback: &dyn CustomizeCallback) -> Customize {
90         callback.special_field(self.message, self.field)
91     }
92 }
93