rotbl 0.2.10

Read Only Table
Documentation
use std::fmt;
use std::io;

use byteorder::BigEndian;
use byteorder::ReadBytesExt;
use byteorder::WriteBytesExt;
use codeq::FixedSize;

#[derive(Debug)]
#[derive(Clone, Copy)]
#[derive(PartialEq, Eq)]
pub enum Version {
    V001,
}

impl fmt::Display for Version {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{:?}", self)
    }
}

impl Version {
    pub fn as_u64(&self) -> u64 {
        match self {
            Version::V001 => 1,
        }
    }

    pub fn from_u64(v: u64) -> Result<Self, u64> {
        match v {
            1 => Ok(Version::V001),
            _ => Err(v),
        }
    }
}

impl FixedSize for Version {
    fn encoded_size() -> usize {
        8
    }
}

impl codeq::Encode for Version {
    fn encode<W: io::Write>(&self, mut w: W) -> Result<usize, io::Error> {
        w.write_u64::<BigEndian>(self.as_u64())?;
        Ok(Self::encoded_size())
    }
}

impl codeq::Decode for Version {
    fn decode<R: io::Read>(mut r: R) -> Result<Self, io::Error> {
        let ver = r.read_u64::<BigEndian>()?;
        Self::from_u64(ver).map_err(|_| {
            io::Error::new(
                io::ErrorKind::InvalidData,
                format!("invalid version:{}", ver),
            )
        })
    }
}

#[cfg(test)]
mod tests {
    use codeq::testing::test_codec;
    use codeq::Encode;

    use crate::version::Version;

    #[test]
    fn test_version_codec() -> anyhow::Result<()> {
        let v = Version::V001;
        let mut b = Vec::new();
        let n = v.encode(&mut b)?;
        assert_eq!(n, b.len());

        test_codec(&b, &v)?;

        Ok(())
    }
}