hdf5_reader/messages/
shared.rs1use crate::error::{Error, Result};
8use crate::io::Cursor;
9
10#[derive(Debug, Clone)]
12pub enum SharedMessage {
13 SharedInOhdr { address: u64 },
15 SharedInSohm { heap_id: Vec<u8> },
17}
18
19pub fn parse(
25 cursor: &mut Cursor<'_>,
26 offset_size: u8,
27 _length_size: u8,
28 msg_size: usize,
29) -> Result<SharedMessage> {
30 let start = cursor.position();
31 let version = cursor.read_u8()?;
32
33 let msg = match version {
34 1 => {
35 let _type_field = cursor.read_u8()?;
37 let _reserved = cursor.read_bytes(6)?;
38 let address = cursor.read_offset(offset_size)?;
39 SharedMessage::SharedInOhdr { address }
40 }
41 2 | 3 => {
42 let type_field = cursor.read_u8()?;
43 match type_field {
44 0 | 2 => {
45 let address = cursor.read_offset(offset_size)?;
47 SharedMessage::SharedInOhdr { address }
48 }
49 1 | 3 => {
50 let heap_id = cursor.read_bytes(8)?.to_vec();
52 SharedMessage::SharedInSohm { heap_id }
53 }
54 t => {
55 return Err(Error::InvalidData(format!(
56 "unknown shared message type: {}",
57 t
58 )));
59 }
60 }
61 }
62 v => {
63 return Err(Error::InvalidData(format!(
64 "unsupported shared message version: {}",
65 v
66 )));
67 }
68 };
69
70 let consumed = (cursor.position() - start) as usize;
71 if consumed < msg_size {
72 cursor.skip(msg_size - consumed)?;
73 }
74
75 Ok(msg)
76}