//! List a remote HDF5 file and read one dataset, then print what it cost. //! //! ```text //! cargo run -p clawhdf5-remote --example read_url -- URL [DATASET] //! ``` use clawhdf5::File; use clawhdf5_remote::{Options, storage_for_url}; fn main() -> Result<(), Box> { let mut args = std::env::args().skip(1); let url = args.next().ok_or("usage: read_url URL [DATASET]")?; let dataset = args.next(); let storage = storage_for_url(&url, &Options::default())?; let file = File::open_storage(storage.clone())?; // Walk the tree. let mut stack = vec![("/".to_string(), file.root())]; while let Some((path, group)) = stack.pop() { for (name, addr) in group.entries()? { let child = format!("{}/{name}", path.trim_end_matches('/')); match file.dataset_at(addr) { Ok(ds) => println!("{child} dataset {:?} {:?}", ds.shape()?, ds.dtype()?), Err(_) => { println!("{child} group"); stack.push((child, file.group_at(addr))); } } } } if let Some(name) = dataset { let values = file.dataset(&name)?.read_f64()?; let shown: Vec<_> = values.iter().take(8).collect(); println!("{name}: {} values, first {shown:?}", values.len()); } let s = storage.stats(); println!( "{} range requests (the one at open included), {} bytes fetched, {} bytes cached", s.requests, s.bytes_fetched, s.cached_bytes ); Ok(()) }