aboutsummaryrefslogtreecommitdiff
path: root/src/customize/ctx.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/customize/ctx.rs')
-rw-r--r--src/customize/ctx.rs92
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)
+ }
+}