blob: 185fc314ad2b4725c0bfd1b8bad141c6e58840a9 [file] [log] [blame]
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)
}
}