use std::mem::size_of;
use async_trait::async_trait;
use num_traits::FromPrimitive;
use crate::data::{OpenRGBReadable, OpenRGBWritable};
use crate::OpenRGBError::{self, ProtocolError};
use crate::protocol::{OpenRGBReadableStream, OpenRGBWritableStream};
#[derive(Primitive, PartialEq, Debug, Copy, Clone)]
pub enum PacketId {
RequestControllerCount = 0,
RequestControllerData = 1,
RequestProtocolVersion = 40,
SetClientName = 50,
DeviceListUpdated = 100,
RequestProfileList = 150,
RequestSaveProfile = 151,
RequestLoadProfile = 152,
RequestDeleteProfile = 153,
RGBControllerResizeZone = 1000,
RGBControllerUpdateLeds = 1050,
RGBControllerUpdateZoneLeds = 1051,
RGBControllerUpdateSingleLed = 1052,
RGBControllerSetCustomMode = 1100,
RGBControllerUpdateMode = 1101,
RGBControllerSaveMode = 1102,
}
#[async_trait]
impl OpenRGBWritable for PacketId {
fn size(&self, _protocol: u32) -> usize {
size_of::<u32>()
}
async fn write(self, stream: &mut impl OpenRGBWritableStream, protocol: u32) -> Result<(), OpenRGBError> {
stream.write_value(self as u32, protocol).await
}
}
#[async_trait]
impl OpenRGBReadable for PacketId {
async fn read(stream: &mut impl OpenRGBReadableStream, protocol: u32) -> Result<Self, OpenRGBError> {
stream.read_value::<u32>(protocol)
.await
.and_then(|id| PacketId::from_u32(id).ok_or_else(|| ProtocolError(format!("unknown packed ID \"{}\"", id))))
}
}
#[cfg(test)]
mod tests {
use std::error::Error;
use num_traits::{FromPrimitive, ToPrimitive};
use tokio_test::io::Builder;
use crate::data::packet::PacketId;
use crate::DEFAULT_PROTOCOL;
use crate::protocol::{OpenRGBReadableStream, OpenRGBWritableStream};
use crate::tests::setup;
#[test]
fn test_convert_to_u32() {
assert_eq!(PacketId::DeviceListUpdated.to_u32(), Some(100));
}
#[test]
fn test_convert_from_u32() {
assert_eq!(PacketId::from_u32(100), Some(PacketId::DeviceListUpdated))
}
#[tokio::test]
async fn test_read_001() -> Result<(), Box<dyn Error>> {
setup()?;
let mut stream = Builder::new()
.read(&1101_u32.to_le_bytes())
.build();
assert_eq!(stream.read_value::<PacketId>(DEFAULT_PROTOCOL).await?, PacketId::RGBControllerUpdateMode);
Ok(())
}
#[tokio::test]
async fn test_write_001() -> Result<(), Box<dyn Error>> {
setup()?;
let mut stream = Builder::new()
.write(&1101_u32.to_le_bytes())
.build();
stream.write_value(PacketId::RGBControllerUpdateMode, DEFAULT_PROTOCOL).await?;
Ok(())
}
}