ddp_connection/protocol/
id.rs

1use serde::{Deserialize, Serialize};
2#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash, Clone, Copy)]
3pub enum ID {
4    Reserved,
5    Default,
6    Custom(u8),
7    Control,
8    Config,
9    Status,
10    DMX,
11    Broadcast,
12}
13
14impl From<u8> for ID {
15    fn from(value: u8) -> Self {
16        match value {
17            0 => ID::Reserved,
18            1 => ID::Default,
19            2..=246 => ID::Custom(value),
20            249 => ID::Control,
21            250 => ID::Config,
22            251 => ID::Status,
23            254 => ID::DMX,
24            255 => ID::Broadcast,
25            _ => ID::Reserved,
26        }
27    }
28}
29
30impl Into<u8> for ID {
31    fn into(self) -> u8 {
32        match self {
33            ID::Reserved => 0,
34            ID::Default => 1,
35            ID::Custom(value) if value >= 2 && value <= 246 => value,
36            ID::Control => 249,
37            ID::Config => 250,
38            ID::Status => 251,
39            ID::DMX => 254,
40            ID::Broadcast => 255,
41            ID::Custom(_) => 1,
42        }
43    }
44}
45
46impl Default for ID {
47    fn default() -> Self {
48        ID::Default
49    }
50}
51
52#[cfg(test)]
53mod tests {
54    use super::*;
55
56    #[test]
57    fn test_id_parse() {
58        // Custom
59        let id = ID::from(212);
60        assert_eq!(id, ID::Custom(212));
61
62        // Default
63        let id = ID::from(1);
64        assert_eq!(id, ID::Default);
65
66        // Status
67        let id = ID::from(251);
68        assert_eq!(id, ID::Status);
69
70        // Reserved
71        let id = ID::from(0);
72        assert_eq!(id, ID::Reserved);
73    }
74}