1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
use crate::error::ProtocolError;
use crate::protocol::Message;
use serde_cbor::Value;
pub fn parse_channel_id(message: &Value) -> Result<u32, ProtocolError> {
let data = match message {
Value::Array(val) => val.to_owned(),
_ => {
return Err(ProtocolError::MessageParseError {
err: "Data not an array".to_owned(),
});
}
};
let mut pieces = data.iter();
let first_param: Value = pieces
.next()
.ok_or(ProtocolError::MessageParseError {
err: "No contents".to_owned(),
})?
.to_owned();
if let Value::U64(channel_id) = first_param {
Ok(channel_id as u32)
} else {
Err(ProtocolError::MessageParseError {
err: "No channel ID found".to_owned(),
})
}
}
pub fn parse_message(message: Value) -> Result<Message, ProtocolError> {
let data = match message {
Value::Array(val) => val.to_owned(),
_ => {
return Err(ProtocolError::MessageParseError {
err: "Data not an array".to_owned(),
});
}
};
let channel_id = *(match data.get(0) {
Some(Value::U64(channel_id)) => channel_id,
_ => {
return Err(ProtocolError::MessageParseError {
err: "No channel ID found".to_owned(),
});
}
}) as u32;
let name = match data.get(1) {
Some(Value::String(name)) => name,
_ => {
return Err(ProtocolError::MessageParseError {
err: "No message name found".to_owned(),
});
}
}
.to_owned();
Ok(Message {
channel_id,
name,
payload: data[2..].to_owned(),
})
}
#[cfg(test)]
mod tests {
use super::*;
use serde_cbor::{de, ser};
#[test]
fn test_parse_channel_id() {
let raw = ser::to_vec_packed(&(1, 2, 3, 4, 5)).unwrap();
let channel_id = parse_channel_id(&de::from_slice(&raw).unwrap()).unwrap();;
assert_eq!(channel_id, 1);
}
#[test]
fn test_parse_channel_message() {
let raw = ser::to_vec_packed(&(10, "test", "data", 12)).unwrap();
let message = parse_message(de::from_slice(&raw).unwrap()).unwrap();
assert_eq!(message.channel_id, 10);
assert_eq!(message.name, "test".to_owned());
assert_eq!(message.payload.len(), 2);
assert_eq!(
message.payload.get(0),
Some(&Value::String("data".to_owned()))
);
assert_eq!(message.payload.get(1), Some(&Value::U64(12)));
}
}