rosbag/record_types/
message_data.rs1use super::utils::{set_field_time, set_field_u32, unknown_field};
2use super::{Error, HeaderGen, RecordGen, Result};
3use crate::cursor::Cursor;
4
5#[derive(Debug, Clone)]
7pub struct MessageData<'a> {
8 pub conn_id: u32,
10 pub time: u64,
12 pub data: &'a [u8],
14}
15
16#[derive(Default, Debug)]
17pub(crate) struct MessageDataHeader {
18 pub conn_id: Option<u32>,
19 pub time: Option<u64>,
20}
21
22impl<'a> RecordGen<'a> for MessageData<'a> {
23 type Header = MessageDataHeader;
24
25 fn read_data(c: &mut Cursor<'a>, header: Self::Header) -> Result<Self> {
26 let conn_id = header.conn_id.ok_or(Error::InvalidHeader)?;
27 let time = header.time.ok_or(Error::InvalidHeader)?;
28 let data = c.next_chunk()?;
29 Ok(MessageData {
30 conn_id,
31 time,
32 data,
33 })
34 }
35}
36
37impl<'a> HeaderGen<'a> for MessageDataHeader {
38 const OP: u8 = 0x02;
39
40 fn process_field(&mut self, name: &str, val: &[u8]) -> Result<()> {
41 match name {
42 "conn" => set_field_u32(&mut self.conn_id, val)?,
43 "time" => set_field_time(&mut self.time, val)?,
44 _ => unknown_field(name, val),
45 }
46 Ok(())
47 }
48}