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
use crate::MessageRequest;
use bytes::BufMut;
use rseip_core::codec::{Encode, Encoder};
impl<P: Encode, D: Encode> Encode for MessageRequest<P, D> {
#[inline]
fn encode<A: Encoder>(self, buf: &mut bytes::BytesMut, encoder: &mut A) -> Result<(), A::Error>
where
Self: Sized,
{
buf.put_u8(self.service_code);
let path_len = self.path.bytes_count();
debug_assert!(path_len <= u8::MAX as usize && path_len % 2 == 0);
buf.put_u8((path_len / 2) as u8);
self.path.encode(buf, encoder)?;
self.data.encode(buf, encoder)?;
Ok(())
}
#[inline]
fn encode_by_ref<A: Encoder>(
&self,
buf: &mut bytes::BytesMut,
encoder: &mut A,
) -> Result<(), A::Error> {
buf.put_u8(self.service_code);
let path_len = self.path.bytes_count();
debug_assert!(path_len <= u8::MAX as usize && path_len % 2 == 0);
buf.put_u8((path_len / 2) as u8);
self.path.encode_by_ref(buf, encoder)?;
self.data.encode_by_ref(buf, encoder)?;
Ok(())
}
#[inline]
fn bytes_count(&self) -> usize {
2 + self.path.bytes_count() + self.data.bytes_count()
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::{epath::EPath, MessageRequest};
use bytes::Bytes;
use rseip_core::tests::EncodeExt;
#[test]
fn test_encode_message_router_request() {
let mr = MessageRequest::new(
0x52,
EPath::default().with_class(0x06).with_instance(0x01),
Bytes::from_static(&[0x10, 0x00]),
);
assert_eq!(mr.bytes_count(), 8);
let buf = mr.try_into_bytes().unwrap();
assert_eq!(
&buf[..],
&[
0x52,
0x02, 0x20, 0x06, 0x24, 0x01,
0x010, 0x00
]
);
}
}