Group::datasets()/groups() (and the Mmap/Lazy handles) listed only hard links, so a soft link to a dataset or group was missing, and dataset(name) / group(name) on a group handle could not open one. In old-style (symbol table) groups a soft link's entry has no object header address, and the listing failed outright trying to parse one. The three facade handles each had their own copy of the child-listing code; they now share group_v2::resolve_group_children, which returns hard links plus soft links resolved to their targets (relative targets from the group holding the link, via the new resolve_path_from). A dangling or cyclic soft link, an external link and a user-defined link are left out — h5py lists their names but cannot open them. Any other error met while resolving is returned, not hidden. Path resolution now walks a relative soft link's target from the group holding it instead of rebuilding the path from the root (same result, one less re-walk), and ignores "." components. Regression test: soft_links_are_listed_as_their_targets (h5py writes absolute, relative, group, dangling, cyclic and external links with libver latest and earliest; listings compared with h5py for File, MmapFile and LazyFile). Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
clawhdf5-format
Pure-Rust HDF5 binary format parsing and writing — no C dependencies.
Features
- Zero-copy superblock, object header, and B-tree parsing
- Chunked dataset read/write with filter pipelines
no_stdsupport (disablestdfeature)- Optional parallel reads via Rayon
- SHA-256 provenance tracking
Usage
use clawhdf5_format::Superblock;
let data = std::fs::read("data.h5").unwrap();
let sb = Superblock::from_bytes(&data).unwrap();
println!("HDF5 version {}.{}", sb.version_major(), sb.version_minor());
License
MIT