diff options
Diffstat (limited to 'src/customize/ctx.rs')
-rw-r--r-- | src/customize/ctx.rs | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/customize/ctx.rs b/src/customize/ctx.rs new file mode 100644 index 0000000..185fc31 --- /dev/null +++ b/src/customize/ctx.rs @@ -0,0 +1,92 @@ +use std::fmt; + +use protobuf::reflect::EnumDescriptor; +use protobuf::reflect::FieldDescriptor; +use protobuf::reflect::FileDescriptor; +use protobuf::reflect::MessageDescriptor; +use protobuf::reflect::OneofDescriptor; + +use crate::customize::CustomizeCallback; +use crate::Customize; + +#[derive(Clone)] +pub(crate) struct CustomizeElemCtx<'a> { + pub(crate) for_elem: Customize, + pub(crate) for_children: Customize, + pub(crate) callback: &'a dyn CustomizeCallback, +} + +impl<'a> fmt::Debug for CustomizeElemCtx<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("CustomizeElemCtx") + .field("for_elem", &self.for_elem) + .field("for_children", &self.for_children) + .finish_non_exhaustive() + } +} + +impl<'a> CustomizeElemCtx<'a> { + pub(crate) fn child( + &self, + elem_from_rustproto: &Customize, + elem_descriptor: &impl DescriptorForCustomize, + ) -> CustomizeElemCtx<'a> { + let mut for_elem = self.for_children.clone(); + for_elem.update_with(elem_from_rustproto); + + let for_children = for_elem.clone(); + + for_elem.update_with(&elem_descriptor.customize(self.callback)); + + CustomizeElemCtx { + for_elem, + for_children, + callback: self.callback, + } + } +} + +pub(crate) trait DescriptorForCustomize { + fn customize(&self, callback: &dyn CustomizeCallback) -> Customize; +} + +impl DescriptorForCustomize for MessageDescriptor { + fn customize(&self, callback: &dyn CustomizeCallback) -> Customize { + callback.message(self) + } +} + +impl DescriptorForCustomize for FieldDescriptor { + fn customize(&self, callback: &dyn CustomizeCallback) -> Customize { + callback.field(self) + } +} + +impl DescriptorForCustomize for EnumDescriptor { + fn customize(&self, callback: &dyn CustomizeCallback) -> Customize { + callback.enumeration(self) + } +} + +impl DescriptorForCustomize for OneofDescriptor { + fn customize(&self, callback: &dyn CustomizeCallback) -> Customize { + callback.oneof(self) + } +} + +impl DescriptorForCustomize for FileDescriptor { + fn customize(&self, callback: &dyn CustomizeCallback) -> Customize { + callback.file(self) + } +} + +pub(crate) struct SpecialFieldPseudoDescriptor<'a> { + pub(crate) message: &'a MessageDescriptor, + pub(crate) field: &'a str, +} + +impl<'a> DescriptorForCustomize for SpecialFieldPseudoDescriptor<'a> { + fn customize(&self, callback: &dyn CustomizeCallback) -> Customize { + callback.special_field(self.message, self.field) + } +} |