use crate::error::{Error, Result};
use crate::io::Cursor;
#[derive(Debug, Clone)]
pub struct SharedTableMessage {
pub table_address: u64,
pub num_indices: u8,
}
pub fn parse(
cursor: &mut Cursor<'_>,
offset_size: u8,
_length_size: u8,
msg_size: usize,
) -> Result<SharedTableMessage> {
let start = cursor.position();
let version = cursor.read_u8()?;
if version != 0 {
return Err(Error::InvalidData(format!(
"unsupported shared message table message version: {version}"
)));
}
cursor.skip(3)?;
let table_address = cursor.read_offset(offset_size)?;
let num_indices = cursor.read_u8()?;
cursor.skip(3)?;
let consumed = (cursor.position() - start) as usize;
if consumed < msg_size {
cursor.skip(msg_size - consumed)?;
}
Ok(SharedTableMessage {
table_address,
num_indices,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parses_shared_table_message() {
let mut bytes = Vec::new();
bytes.push(0);
bytes.extend_from_slice(&[0, 0, 0]);
bytes.extend_from_slice(&0x1234u64.to_le_bytes());
bytes.push(2);
bytes.extend_from_slice(&[0, 0, 0]);
let mut cursor = Cursor::new(&bytes);
let msg = parse(&mut cursor, 8, 8, bytes.len()).unwrap();
assert_eq!(msg.table_address, 0x1234);
assert_eq!(msg.num_indices, 2);
}
}