use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Clone, Copy, Default)]
pub enum ID {
Reserved,
#[default]
Default,
Custom(u8),
Control,
Config,
Status,
DMX,
Broadcast,
}
impl From<u8> for ID {
fn from(value: u8) -> Self {
match value {
0 => ID::Reserved,
1 => ID::Default,
246 => ID::Control,
250 => ID::Config,
251 => ID::Status,
254 => ID::DMX,
255 => ID::Broadcast,
_ => ID::Custom(value),
}
}
}
impl Into<u8> for ID {
fn into(self) -> u8 {
match self {
ID::Reserved => 0,
ID::Default => 1,
ID::Control => 246,
ID::Config => 250,
ID::Status => 251,
ID::DMX => 254,
ID::Broadcast => 255,
ID::Custom(value) => {
if matches!(value, 2..=245 | 247..=249 | 252..=253) {
value
} else {
1 }
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_id_parse() {
let id = ID::from(212);
assert_eq!(id, ID::Custom(212));
let id = ID::from(1);
assert_eq!(id, ID::Default);
let id = ID::from(251);
assert_eq!(id, ID::Status);
let id = ID::from(0);
assert_eq!(id, ID::Reserved);
}
}