xio_common 0.12.0

XIO commonly used functionality
Documentation
use crate::base::DataType;
use snafu::ResultExt;
use std::io::{Read, Write};
use crate::{error, ReadExt, Result, TryFrom, WithFixedPayloadLength, WriteExt};

impl WithFixedPayloadLength for DataType {
    const FIXED_PAYLOAD_LENGTH: u16 = u8::FIXED_PAYLOAD_LENGTH;
}

pub(crate) trait DataTypeWriterExt: Write {
    fn write_data_type(&mut self, t: DataType) -> Result<()> {
        self.write_u8(t as u8)
    }

    fn write_data_types(&mut self, t: &[DataType]) -> Result<()> {
        for v in t {
            self.write_data_type(v.clone())?;
        }
        Ok(())
    }
}

impl<B: Write + ?Sized> DataTypeWriterExt for B {}

pub(crate) trait DataTypeReaderExt: Read {
    fn read_data_type(&mut self) -> Result<DataType> {
        let value = self.read_u8()?;
        DataType::try_from(value).context(error::Io)
    }

    fn read_data_types(&mut self, count: usize) -> Result<Vec<DataType>> {
        (0usize..count)
            .map(|_| self.read_data_type())
            .collect::<Result<Vec<DataType>>>()
    }
}

impl<B: Read + ?Sized> DataTypeReaderExt for B {}