use crate::core::{
encode::{EncodeError, InvalidStructureError},
model::Model,
view::{View, ViewConversionError},
};
pub trait TryFromView: Sized {
type ViewType: View + ?Sized;
fn try_from_view(view: &Self::ViewType) -> Result<Self, ViewConversionError>;
#[inline]
fn try_from_slice<'buf>(buf: &'buf [u8]) -> Result<(Self, &'buf [u8]), ViewConversionError>
where
<Self as TryFromView>::ViewType: 'buf,
{
let (view, rest) = Self::ViewType::try_from_slice(buf)?;
let model = Self::try_from_view(view)?;
Ok((model, rest))
}
}
pub trait FromView: Sized {
type ViewType: View + ?Sized;
fn from_view(view: &Self::ViewType) -> Self;
}
impl<VT: FromView> TryFromView for VT {
type ViewType = VT::ViewType;
#[inline]
fn try_from_view(view: &Self::ViewType) -> Result<Self, ViewConversionError> {
Ok(VT::from_view(view))
}
}
pub trait TryToModel: View {
type ModelType: TryFromView<ViewType = Self>;
#[inline]
fn try_to_model(&self) -> Result<Self::ModelType, ViewConversionError> {
Self::ModelType::try_from_view(self)
}
}
impl<V: View + TryFromModel + ?Sized> TryToModel for V
where
V::ModelType: TryFromView<ViewType = V>,
{
type ModelType = V::ModelType;
}
pub trait ToModel: View {
type ModelType: FromView<ViewType = Self>;
#[inline]
fn to_model(&self) -> Self::ModelType {
Self::ModelType::from_view(self)
}
}
impl<V: View + TryFromModel + ?Sized> ToModel for V
where
V::ModelType: FromView<ViewType = V>,
{
type ModelType = V::ModelType;
}
pub trait TryFromModel: View {
type ModelType: Model<ViewType = Self>;
#[inline]
fn try_from_model<'buf>(
model: &Self::ModelType,
buf: &'buf mut [u8],
) -> Result<(&'buf mut Self, &'buf mut [u8]), EncodeError> {
model.try_encode_to_view(buf)
}
#[inline]
fn try_boxed_from_model(model: &Self::ModelType) -> Result<Box<Self>, InvalidStructureError> {
model.try_encode_to_owned_view()
}
}