rosbag/record_types/
message_data.rs

1use super::utils::{set_field_time, set_field_u32, unknown_field};
2use super::{Error, HeaderGen, RecordGen, Result};
3use crate::cursor::Cursor;
4
5/// Message data for a `Connection` with `conn_id` ID.
6#[derive(Debug, Clone)]
7pub struct MessageData<'a> {
8    /// ID for connection on which message arrived
9    pub conn_id: u32,
10    /// Time at which the message was received in nanoseconds of UNIX epoch
11    pub time: u64,
12    /// Serialized message data in the ROS serialization format
13    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}