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, Response, TraceOn, TraceOff, Reserved, TriggeredRequest, TriggeredResponse, TriggeredAcknowledgement, UpdateRequest, UpdateResponse, UpdateAcknowledge, 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}