serde-types 0.1.1

Extension helper types for serde
Documentation
use concat_idents::concat_idents;

use super::*;

impl StreamReader for () {
    fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
        Ok(())
    }
}

impl StreamReader for bool {
    fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
        match buffer.read_u8()? {
            0 => Ok(true),
            _ => Ok(false),
        }
    }
}

impl StreamReader for u8 {
    fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
        buffer.read_u8()
    }
}

impl StreamReader for i8 {
    fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
        buffer.read_i8()
    }
}

macro_rules! r_number {
    ($($t:ty),*) => {
        $(
            impl StreamReader for $t {
                fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
                    concat_idents!(read_fn = read_, $t {
                        match order {
                            ByteOrder::BigEndian => buffer.read_fn::<BigEndian>(),
                            ByteOrder::LittleEndian => buffer.read_fn::<LittleEndian>(),
                        }
                    })
                }
            }
        )*
    };
}

r_number![u16, u32, u64, u128];
r_number![i16, i32, i64, i128];
r_number![f32, f64];

impl<T> StreamReader for Vec<T>
where
    T: StreamReader,
{
    fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
        let mut out = <Vec<T>>::with_capacity(u32::read_from(buffer, order)? as usize);
        for _ in 0..out.capacity() {
            out.push(T::read_from(buffer, order)?);
        }
        Ok(out)
    }
}

impl<T> StreamReader for VecDeque<T>
where
    T: StreamReader,
{
    fn read_from<R: Read>(buffer: &mut R, order: ByteOrder) -> Result<Self> {
        let mut out = <VecDeque<T>>::with_capacity(u32::read_from(buffer, order)? as usize);
        for _ in 0..out.capacity() {
            out.push_back(T::read_from(buffer, order)?);
        }
        Ok(out)
    }
}