use core::marker::PhantomData;
use crate::{Decoder, Encoder, FixedMeasurer, Measurer, error};
pub trait Decode<'encoded> {
fn decode(encoded: &'encoded [u8], offset: &mut usize) -> Result<Self, error::DecodeError>
where
Self: Sized;
}
pub trait DecodeOwned: for<'encoded> Decode<'encoded> + Sized {
fn decode_owned(encoded: &[u8], offset: &mut usize) -> Result<Self, error::DecodeError> {
Self::decode(encoded, offset)
}
}
pub trait Encode {
fn encode(&self, encoded: &mut [u8], offset: &mut usize) -> Result<(), error::EncodeError>;
}
pub trait Measure {
fn measure(&self) -> Result<usize, error::EncodeError>;
}
pub trait MeasureFixed: Measure {
fn measure_fixed() -> usize;
}
pub struct SelfCoded<T>(PhantomData<T>);
impl<T> SelfCoded<T> {
pub const fn new() -> Self {
Self(PhantomData)
}
}
impl<'encoded, 'decoded, T> Decoder<'encoded, 'decoded> for SelfCoded<T>
where
T: Decode<'encoded> + 'decoded,
{
type Decoded = T;
fn decode(
&self,
encoded: &'encoded [u8],
offset: &mut usize,
) -> Result<Self::Decoded, error::DecodeError> {
T::decode(encoded, offset)
}
}
impl<T> Encoder for SelfCoded<T>
where
T: Encode,
{
type Decoded = T;
fn encode(
&self,
decoded: &Self::Decoded,
encoded: &mut [u8],
offset: &mut usize,
) -> Result<(), error::EncodeError> {
decoded.encode(encoded, offset)
}
}
impl<T> Measurer for SelfCoded<T>
where
T: Measure,
{
type Decoded = T;
fn measure(&self, decoded: &Self::Decoded) -> Result<usize, error::EncodeError> {
decoded.measure()
}
}
impl<T> FixedMeasurer for SelfCoded<T>
where
T: MeasureFixed,
{
fn measure_fixed(&self) -> usize {
T::measure_fixed()
}
}