use std::fmt; use std::marker; use crate::message_dyn::MessageDyn; use crate::message_full::MessageFull; use crate::reflect::acc::v2::AccessorV2; use crate::reflect::acc::FieldAccessor; use crate::reflect::repeated::ReflectRepeated; use crate::reflect::repeated::ReflectRepeatedMut; use crate::reflect::repeated::ReflectRepeatedRef; use crate::reflect::runtime_types::RuntimeTypeTrait; use crate::reflect::ProtobufValue; use crate::reflect::RuntimeType; pub(crate) trait RepeatedFieldAccessor: Send + Sync + 'static { fn get_repeated<'a>(&self, m: &'a dyn MessageDyn) -> ReflectRepeatedRef<'a>; fn mut_repeated<'a>(&self, m: &'a mut dyn MessageDyn) -> ReflectRepeatedMut<'a>; fn element_type(&self) -> RuntimeType; } pub(crate) struct RepeatedFieldAccessorHolder { pub accessor: Box, } impl<'a> fmt::Debug for RepeatedFieldAccessorHolder { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RepeatedFieldAccessorHolder").finish() } } trait RepeatedFieldGetMut: Send + Sync + 'static where M: MessageFull + 'static, { fn get_field<'a>(&self, message: &'a M) -> &'a R; fn mut_field<'a>(&self, message: &'a mut M) -> &'a mut R; } struct RepeatedFieldGetMutImpl where M: MessageFull + 'static, { get_field: for<'a> fn(&'a M) -> &'a L, mut_field: for<'a> fn(&'a mut M) -> &'a mut L, } impl RepeatedFieldGetMut for RepeatedFieldGetMutImpl> where M: MessageFull + 'static, V: ProtobufValue, { fn get_field<'a>(&self, m: &'a M) -> &'a dyn ReflectRepeated { (self.get_field)(m) as &dyn ReflectRepeated } fn mut_field<'a>(&self, m: &'a mut M) -> &'a mut dyn ReflectRepeated { (self.mut_field)(m) as &mut dyn ReflectRepeated } } struct RepeatedFieldAccessorImpl where M: MessageFull, V: ProtobufValue, { fns: Box>, _marker: marker::PhantomData, } impl RepeatedFieldAccessor for RepeatedFieldAccessorImpl where M: MessageFull, V: ProtobufValue, { fn get_repeated<'a>(&self, m: &'a dyn MessageDyn) -> ReflectRepeatedRef<'a> { let m = m.downcast_ref().unwrap(); let repeated = self.fns.get_field(m); ReflectRepeatedRef::new(repeated) } fn mut_repeated<'a>(&self, m: &'a mut dyn MessageDyn) -> ReflectRepeatedMut<'a> { let m = m.downcast_mut().unwrap(); let repeated = self.fns.mut_field(m); ReflectRepeatedMut::new(repeated) } fn element_type(&self) -> RuntimeType { V::RuntimeType::runtime_type_box() } } /// Make accessor for `Vec` field pub fn make_vec_simpler_accessor( name: &'static str, get_vec: for<'a> fn(&'a M) -> &'a Vec, mut_vec: for<'a> fn(&'a mut M) -> &'a mut Vec, ) -> FieldAccessor where M: MessageFull + 'static, V: ProtobufValue, { FieldAccessor::new( name, AccessorV2::Repeated(RepeatedFieldAccessorHolder { accessor: Box::new(RepeatedFieldAccessorImpl:: { fns: Box::new(RepeatedFieldGetMutImpl::> { get_field: get_vec, mut_field: mut_vec, }), _marker: marker::PhantomData::, }), }), ) }