use crate::core::{
encode::{EncodeError, InvalidStructureError, WireEncode},
view::View,
};
pub trait Model: WireEncode {
type ViewType: View + ?Sized;
#[inline]
fn try_encode_to_view<'buf>(
&self,
buf: &'buf mut [u8],
) -> Result<(&'buf mut Self::ViewType, &'buf mut [u8]), EncodeError> {
let encoded_size = self.try_encode(buf)?;
let (view_buf, rest) = buf.split_at_mut(encoded_size);
let (view, rest2) = Self::ViewType::try_from_mut_slice(view_buf)
.expect("All encoded models must produce valid view encodings");
debug_assert!(
rest2.is_empty(),
"View should consume the entire encoded buffer"
);
Ok((view, rest))
}
#[inline]
fn try_encode_to_owned_view(&self) -> Result<Box<Self::ViewType>, InvalidStructureError> {
let vec = self.try_encode_to_vec()?;
let view = Self::ViewType::try_from_boxed(vec.into_boxed_slice())
.expect("All encoded models must produce valid view encodings");
Ok(view)
}
}