pub(crate) use self::internal::*; use core::marker::PhantomData; pub trait Config: InternalConfig + Copy + Clone + Sized { fn with_big_endian(self) -> BigEndian { BigEndian { _pd: PhantomData } } fn with_little_endian(self) -> LittleEndian { LittleEndian { _pd: PhantomData } } fn with_variable_int_encoding(self) -> Varint { Varint { _pd: PhantomData } } fn with_fixed_int_encoding(self) -> Fixint { Fixint { _pd: PhantomData } } } impl Config for T {} #[derive(Copy, Clone)] pub struct Default; impl InternalConfig for Default { const ENDIAN: Endian = Endian::Little; const INT_ENCODING: IntEncoding = IntEncoding::Variable; const LIMIT: Option = None; const ALLOW_TRAILING: bool = true; } #[derive(Copy, Clone)] pub struct BigEndian { _pd: PhantomData, } impl InternalConfig for BigEndian { const ENDIAN: Endian = Endian::Big; const INT_ENCODING: IntEncoding = C::INT_ENCODING; const LIMIT: Option = C::LIMIT; const ALLOW_TRAILING: bool = C::ALLOW_TRAILING; } #[derive(Copy, Clone)] pub struct LittleEndian { _pd: PhantomData, } impl InternalConfig for LittleEndian { const ENDIAN: Endian = Endian::Little; const INT_ENCODING: IntEncoding = C::INT_ENCODING; const LIMIT: Option = C::LIMIT; const ALLOW_TRAILING: bool = C::ALLOW_TRAILING; } #[derive(Copy, Clone)] pub struct Fixint { _pd: PhantomData, } impl InternalConfig for Fixint { const ENDIAN: Endian = C::ENDIAN; const INT_ENCODING: IntEncoding = IntEncoding::Fixed; const LIMIT: Option = C::LIMIT; const ALLOW_TRAILING: bool = C::ALLOW_TRAILING; } #[derive(Copy, Clone)] pub struct Varint { _pd: PhantomData, } impl InternalConfig for Varint { const ENDIAN: Endian = C::ENDIAN; const INT_ENCODING: IntEncoding = IntEncoding::Variable; const LIMIT: Option = C::LIMIT; const ALLOW_TRAILING: bool = C::ALLOW_TRAILING; } mod internal { pub trait InternalConfig: Copy + Clone { const ENDIAN: Endian; const INT_ENCODING: IntEncoding; const LIMIT: Option; const ALLOW_TRAILING: bool; } #[derive(PartialEq, Eq)] pub enum Endian { Little, Big, } #[derive(PartialEq, Eq)] pub enum IntEncoding { Fixed, Variable, } impl<'a, C: InternalConfig> InternalConfig for &'a mut C where &'a mut C: Copy + Clone, { const ENDIAN: Endian = C::ENDIAN; const INT_ENCODING: IntEncoding = C::INT_ENCODING; const LIMIT: Option = C::LIMIT; const ALLOW_TRAILING: bool = C::ALLOW_TRAILING; } }