use derivative::Derivative; use derive_more::{Deref, DerefMut, From, IntoIterator}; use serde::{Deserialize, Serialize}; pub trait MessageModel: Into + for<'m> TryFrom<&'m Message> { } impl MessageModel for Model where Message: prost::Message, Model: Into + for<'m> TryFrom<&'m Message>, { } #[derive( Derivative, Debug, Clone, PartialEq, Eq, Hash, From, Deref, DerefMut, Serialize, Deserialize, IntoIterator, )] #[derivative(Default(bound = ""))] #[serde(transparent)] #[into_iterator(owned, ref, ref_mut)] pub struct RepeatedMessageModel(Vec); impl RepeatedMessageModel { pub fn into_inner(self) -> Vec { self.0 } } impl<'m, Message, Model> TryFrom<&'m Vec> for RepeatedMessageModel where Message: prost::Message, Model: MessageModel, { type Error = >::Error; fn try_from(value: &'m Vec) -> Result { Ok(Self( value .iter() .map(TryInto::try_into) .collect::>()?, )) } } impl From> for Vec where Message: prost::Message, Model: MessageModel, { fn from(value: RepeatedMessageModel) -> Self { value.into_iter().map(Into::into).collect() } }