rip_rs/
command.rs

1use crate::parser::Parsed;
2use crate::serializer::SerializeError::UnknownCommandKind;
3use crate::serializer::{Serializable, SerializeError};
4use crate::{byte_reader, parser::ParseError};
5
6#[derive(PartialEq, Copy, Clone, Debug)]
7pub enum Kind {
8    Invalid,
9    Request,                  // RFC1058
10    Response,                 // RFC1058
11    TraceOn,                  // RFC1058
12    TraceOff,                 // RFC1058
13    Reserved,                 // RFC1058
14    TriggeredRequest,         // RFC1582
15    TriggeredResponse,        // RFC1582
16    TriggeredAcknowledgement, // RFC1582
17    UpdateRequest,            // RFC2091
18    UpdateResponse,           // RFC2091
19    UpdateAcknowledge,        // RFC2091
20    Unknown,
21}
22
23impl Kind {
24    pub fn from_u8(value: u8) -> Self {
25        match value {
26            0 => Kind::Invalid,
27            1 => Kind::Request,
28            2 => Kind::Response,
29            3 => Kind::TraceOn,
30            4 => Kind::TraceOff,
31            5 => Kind::Reserved,
32            6 => Kind::TriggeredRequest,
33            7 => Kind::TriggeredResponse,
34            8 => Kind::TriggeredAcknowledgement,
35            9 => Kind::UpdateRequest,
36            10 => Kind::UpdateResponse,
37            11 => Kind::UpdateAcknowledge,
38            _ => Kind::Unknown,
39        }
40    }
41
42    pub fn to_u8(&self) -> Option<u8> {
43        match self {
44            Kind::Invalid => Some(0),
45            Kind::Request => Some(1),
46            Kind::Response => Some(2),
47            Kind::TraceOn => Some(3),
48            Kind::TraceOff => Some(4),
49            Kind::Reserved => Some(5),
50            Kind::TriggeredRequest => Some(6),
51            Kind::TriggeredResponse => Some(7),
52            Kind::TriggeredAcknowledgement => Some(8),
53            Kind::UpdateRequest => Some(9),
54            Kind::UpdateResponse => Some(10),
55            Kind::UpdateAcknowledge => Some(11),
56            Kind::Unknown => None,
57        }
58    }
59
60    pub(crate) fn parse(cursor: usize, bytes: &[u8]) -> Result<Parsed<Kind>, ParseError> {
61        let (command_byte, cursor) = byte_reader::read(cursor, bytes)?;
62
63        let command = match Kind::from_u8(command_byte) {
64            Kind::Unknown => {
65                return Err(ParseError::UnknownCommandKind(command_byte, cursor));
66            }
67            _command => _command,
68        };
69
70        Ok((command, cursor))
71    }
72}
73
74impl Serializable for Kind {
75    fn to_bytes(&self) -> Result<Vec<u8>, SerializeError> {
76        match self.to_u8() {
77            Some(byte) => Ok(vec![byte]),
78            None => Err(UnknownCommandKind),
79        }
80    }
81}
82
83#[cfg(test)]
84mod tests {
85    use crate::command::Kind;
86    use crate::parser::ParseError;
87    use crate::serializer::{Serializable, SerializeError};
88
89    #[test]
90    fn test_parse() {
91        let (kind, cursor) = Kind::parse(0, vec![0x00].as_slice()).unwrap();
92        assert_eq!(kind, Kind::Invalid);
93        assert_eq!(cursor, 1);
94        let (kind, cursor) = Kind::parse(0, vec![0x01].as_slice()).unwrap();
95        assert_eq!(kind, Kind::Request);
96        assert_eq!(cursor, 1);
97        let (kind, cursor) = Kind::parse(0, vec![0x02].as_slice()).unwrap();
98        assert_eq!(kind, Kind::Response);
99        assert_eq!(cursor, 1);
100        let (kind, cursor) = Kind::parse(0, vec![0x03].as_slice()).unwrap();
101        assert_eq!(kind, Kind::TraceOn);
102        assert_eq!(cursor, 1);
103        let (kind, cursor) = Kind::parse(0, vec![0x04].as_slice()).unwrap();
104        assert_eq!(kind, Kind::TraceOff);
105        assert_eq!(cursor, 1);
106        let (kind, cursor) = Kind::parse(0, vec![0x05].as_slice()).unwrap();
107        assert_eq!(kind, Kind::Reserved);
108        assert_eq!(cursor, 1);
109        let (kind, cursor) = Kind::parse(0, vec![0x06].as_slice()).unwrap();
110        assert_eq!(kind, Kind::TriggeredRequest);
111        assert_eq!(cursor, 1);
112        let (kind, cursor) = Kind::parse(0, vec![0x07].as_slice()).unwrap();
113        assert_eq!(kind, Kind::TriggeredResponse);
114        assert_eq!(cursor, 1);
115        let (kind, cursor) = Kind::parse(0, vec![0x08].as_slice()).unwrap();
116        assert_eq!(kind, Kind::TriggeredAcknowledgement);
117        assert_eq!(cursor, 1);
118        let (kind, cursor) = Kind::parse(0, vec![0x09].as_slice()).unwrap();
119        assert_eq!(kind, Kind::UpdateRequest);
120        assert_eq!(cursor, 1);
121        let (kind, cursor) = Kind::parse(0, vec![0x0a].as_slice()).unwrap();
122        assert_eq!(kind, Kind::UpdateResponse);
123        assert_eq!(cursor, 1);
124        let (kind, cursor) = Kind::parse(0, vec![0x0b].as_slice()).unwrap();
125        assert_eq!(kind, Kind::UpdateAcknowledge);
126        assert_eq!(cursor, 1);
127
128        assert_eq!(
129            Kind::parse(0, vec![0xff].as_slice()).unwrap_err(),
130            ParseError::UnknownCommandKind(0xff, 1)
131        );
132    }
133
134    #[test]
135    fn test_to_bytes() {
136        assert_eq!(Kind::Invalid.to_bytes().unwrap(), vec![0]);
137        assert_eq!(Kind::Request.to_bytes().unwrap(), vec![1]);
138        assert_eq!(Kind::Response.to_bytes().unwrap(), vec![2]);
139        assert_eq!(Kind::TraceOn.to_bytes().unwrap(), vec![3]);
140        assert_eq!(Kind::TraceOff.to_bytes().unwrap(), vec![4]);
141        assert_eq!(Kind::Reserved.to_bytes().unwrap(), vec![5]);
142        assert_eq!(Kind::TriggeredRequest.to_bytes().unwrap(), vec![6]);
143        assert_eq!(Kind::TriggeredResponse.to_bytes().unwrap(), vec![7]);
144        assert_eq!(Kind::TriggeredAcknowledgement.to_bytes().unwrap(), vec![8]);
145        assert_eq!(Kind::UpdateRequest.to_bytes().unwrap(), vec![9]);
146        assert_eq!(Kind::UpdateResponse.to_bytes().unwrap(), vec![10]);
147        assert_eq!(Kind::UpdateAcknowledge.to_bytes().unwrap(), vec![11]);
148
149        assert_eq!(
150            Kind::Unknown.to_bytes().unwrap_err(),
151            SerializeError::UnknownCommandKind
152        );
153    }
154}