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
use crate::{EncodeResult, Encoder, Header, MessageHeader, Value};
use num_traits::ToPrimitive;
impl<'a> Encoder<'a> {
pub fn message_header(
&mut self,
message_header: &MessageHeader,
body: Option<(u32, String)>,
) -> EncodeResult {
let is_le = message_header.is_le;
if is_le {
self.byte(0x6c)
} else {
self.byte(0x42)
}
self.byte(message_header.message_type.to_u8().unwrap());
self.byte(message_header.message_flags.bits());
self.byte(message_header.version);
let mut headers = message_header.headers.clone();
let body_length = if let Some((body_length, body_signature)) = body {
headers.insert(Header::Signature(body_signature));
body_length
} else {
0
};
self.uint_32(body_length, is_le);
self.uint_32(message_header.serial, is_le);
let headers = headers.into_iter().map(Value::from).collect();
self.array(&headers, "(yv)", is_le)?;
Ok(())
}
}