1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
use byteorder::{ReadBytesExt, WriteBytesExt}; use snafu::ResultExt; use std::io; use std::io::{Read, Write}; use crate::{error, Endian, Result, TryFrom, WithFixedPayloadLength}; #[repr(u16)] #[derive(Clone, Debug, PartialEq)] pub enum DeviceCapability { ParametersLimit = 0, JobLimit = 1, InstructionChunkLimit = 2, } impl WithFixedPayloadLength for DeviceCapability { const FIXED_PAYLOAD_LENGTH: u16 = u16::FIXED_PAYLOAD_LENGTH; } impl TryFrom<u16> for DeviceCapability { type Err = io::Error; fn try_from(value: u16) -> io::Result<Self> { match value { 0 => Ok(DeviceCapability::ParametersLimit), 1 => Ok(DeviceCapability::JobLimit), 2 => Ok(DeviceCapability::InstructionChunkLimit), _ => Err(io::Error::new( io::ErrorKind::InvalidData, format!("Invalid DeviceCapability enum value {}", value), )), } } } pub(crate) trait DeviceCapabilityWriterExt: Write { fn write_device_capability( &mut self, device_capability: &DeviceCapability, ) -> io::Result<()> { self.write_u16::<Endian>(device_capability.clone() as u16) } } impl<B: Write + ?Sized> DeviceCapabilityWriterExt for B {} pub(crate) trait DeviceCapabilityReaderExt: Read { fn read_device_capability(&mut self) -> Result<DeviceCapability> { let value = self.read_u16::<Endian>().context(error::Io)?; DeviceCapability::try_from(value).context(error::Io) } } impl<B: Read + ?Sized> DeviceCapabilityReaderExt for B {}