Skip to main content

async_hdf5/messages/
attribute_info.rs

1use bytes::Bytes;
2
3use crate::endian::HDF5Reader;
4use crate::error::Result;
5
6/// Attribute info message — points to fractal heap + B-tree v2 for dense attribute storage.
7///
8/// Message type 0x0015.
9#[derive(Debug, Clone)]
10pub struct AttributeInfoMessage {
11    /// Address of fractal heap for attribute data.
12    pub fractal_heap_address: u64,
13    /// Address of B-tree v2 for name-indexed attribute lookup.
14    pub name_btree_address: u64,
15    /// Address of B-tree v2 for creation-order-indexed lookup (if tracked).
16    pub creation_order_btree_address: Option<u64>,
17    /// Maximum creation order index value.
18    pub max_creation_index: Option<u16>,
19}
20
21impl AttributeInfoMessage {
22    /// Parse from the raw message bytes.
23    pub fn parse(data: &Bytes, size_of_offsets: u8, size_of_lengths: u8) -> Result<Self> {
24        let mut r = HDF5Reader::with_sizes(data.clone(), size_of_offsets, size_of_lengths);
25
26        let _version = r.read_u8()?;
27        let flags = r.read_u8()?;
28
29        let max_creation_index = if flags & 0x01 != 0 {
30            Some(r.read_u16()?)
31        } else {
32            None
33        };
34
35        let fractal_heap_address = r.read_offset()?;
36        let name_btree_address = r.read_offset()?;
37
38        let creation_order_btree_address = if flags & 0x01 != 0 {
39            Some(r.read_offset()?)
40        } else {
41            None
42        };
43
44        Ok(Self {
45            fractal_heap_address,
46            name_btree_address,
47            creation_order_btree_address,
48            max_creation_index,
49        })
50    }
51}