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