use core::marker::PhantomData; use crate::{ config::{Config, Endian}, error::Error, }; use read::Reader; mod impls; pub mod read; pub trait Decodable: Sized { fn decode(decoder: D) -> Result; } pub trait Decode { fn decode_u32(&mut self) -> Result; } pub struct Decoder { reader: R, config: PhantomData, } impl<'de, R: Reader<'de>, C: Config> Decoder { pub fn new(reader: R) -> Decoder { Decoder { reader, config: PhantomData, } } } impl<'a, 'de, R: Reader<'de>, C: Config> Decode for &'a mut Decoder { fn decode_u32(&mut self) -> Result { let mut bytes = [0u8; 4]; self.reader.read(bytes.as_mut())?; Ok(match C::ENDIAN { Endian::Little => u32::from_le_bytes(bytes), Endian::Big => u32::from_be_bytes(bytes), }) } }