Skip to main content

hdf5_reader/messages/
symbol_table_msg.rs

1//! HDF5 Symbol Table message (type 0x0011).
2//!
3//! This is only found in v0/v1 object headers and points to the B-tree and
4//! local heap used for group membership in the older format.
5
6use crate::error::Result;
7use crate::io::Cursor;
8
9/// Parsed symbol table message.
10#[derive(Debug, Clone)]
11pub struct SymbolTableMessage {
12    /// Address of the v1 B-tree for this group.
13    pub btree_address: u64,
14    /// Address of the local heap for name storage.
15    pub heap_address: u64,
16}
17
18/// Parse a symbol table message.
19pub fn parse(
20    cursor: &mut Cursor<'_>,
21    offset_size: u8,
22    _length_size: u8,
23    _msg_size: usize,
24) -> Result<SymbolTableMessage> {
25    let btree_address = cursor.read_offset(offset_size)?;
26    let heap_address = cursor.read_offset(offset_size)?;
27
28    Ok(SymbolTableMessage {
29        btree_address,
30        heap_address,
31    })
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn test_parse_symbol_table_msg() {
40        let mut data = Vec::new();
41        // btree address = 0x1000
42        data.extend_from_slice(&0x1000u64.to_le_bytes());
43        // heap address = 0x2000
44        data.extend_from_slice(&0x2000u64.to_le_bytes());
45
46        let mut cursor = Cursor::new(&data);
47        let msg = parse(&mut cursor, 8, 8, data.len()).unwrap();
48        assert_eq!(msg.btree_address, 0x1000);
49        assert_eq!(msg.heap_address, 0x2000);
50    }
51}