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
use super::{codec, ids, Err};
use heapless::{consts::U16, String};
use nom::{number::streaming, InputIter};
pub struct GetVersion {}
impl super::RPC for GetVersion {
type ReturnValue = String<U16>;
type Error = ();
fn header(&self, seq: u32) -> codec::Header {
codec::Header {
sequence: seq,
msg_type: ids::MsgType::Invocation,
service: ids::Service::System,
request: ids::SystemRequest::VersionID.into(),
}
}
fn parse(&mut self, data: &[u8]) -> Result<String<U16>, Err<()>> {
let (data, hdr) = codec::Header::parse(data)?;
if hdr.msg_type != ids::MsgType::Reply
|| hdr.service != ids::Service::System
|| hdr.request != ids::SystemRequest::VersionID.into()
{
return Err(Err::NotOurs);
}
let (data, length) = streaming::le_u32(data)?;
if length > 16 {
return Err(Err::ResponseOverrun);
}
let mut out: Self::ReturnValue = String::new();
for b in data.iter_elements() {
out.push(b as char).map_err(|_| Err::ResponseOverrun)?;
}
Ok(out)
}
}