//! `h5rs`: HDF5 command-line tools built on clawhdf5 alone, no libhdf5. //! //! The binary's subcommands (`ls`, `dump`, `stat`, `diff`, `check`) live in //! the modules below; [`run`] dispatches to them. See the crate README for //! the command reference. pub mod check; pub mod cli; pub mod diff; pub mod dtype; pub mod dump; pub mod h5; pub mod heap_blocks; pub mod info; pub mod ls; pub mod stat; pub mod value; use cli::{Args, Out}; pub const USAGE: &str = "\ h5rs: HDF5 tools in pure Rust (clawhdf5, no libhdf5) usage: h5rs [options] ... commands: ls list objects (like h5ls) dump print a file's structure and values as DDL or JSON (like h5dump) stat object, layout, filter and storage statistics (like h5stat) diff compare two files (like h5diff) check validate a file's structure and checksums Run `h5rs --help` for a command's options."; /// Run `h5rs` with `argv` (without the program name). Returns the exit /// status. pub fn run(argv: Vec, out: &mut Out) -> std::io::Result { let mut it = argv.into_iter(); let Some(cmd) = it.next() else { writeln!(out.e, "{USAGE}")?; return Ok(2); }; let rest: Vec = it.collect(); match cmd.as_str() { "ls" => ls::run(&mut Args::new("ls", rest), out), "dump" => dump::run(&mut Args::new("dump", rest), out), "stat" => stat::run(&mut Args::new("stat", rest), out), "diff" => diff::run(&mut Args::new("diff", rest), out), "check" => check::run(&mut Args::new("check", rest), out), "-h" | "--help" | "help" => { writeln!(out.o, "{USAGE}")?; Ok(0) } "-V" | "--version" => { writeln!(out.o, "h5rs {}", env!("CARGO_PKG_VERSION"))?; Ok(0) } other => { writeln!(out.e, "h5rs: unknown command {other:?}\n\n{USAGE}")?; Ok(2) } } }