From 0324ffe843693451eb3a8b34a7aadf457f68ae90 Mon Sep 17 00:00:00 2001 From: Lachlan Deakin Date: Wed, 3 Jul 2024 22:06:36 +1000 Subject: [PATCH] Add group metadata support to `zarrs_info` --- CHANGELOG.md | 3 ++ Cargo.lock | 7 ++- Cargo.toml | 8 ++-- src/bin/zarrs_info.rs | 106 +++++++++++++++++++++++------------------- 4 files changed, 69 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cb3890..dbdd7a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + - `zarrs_info`: add group metadata support + ## [0.5.0] - 2024-07-02 ### Added diff --git a/Cargo.lock b/Cargo.lock index 5989160..94117e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1821,9 +1821,8 @@ dependencies = [ [[package]] name = "zarrs" -version = "0.15.0-beta.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13f45237f4d940c776a56a2315bbc06c5208daa55c413f5487edbb69c5fd327" +version = "0.15.0-beta.2" +source = "git+https://github.com/LDeakin/zarrs.git#b7059df2764b2e22c5bf9a4e1b5db5617686c2a1" dependencies = [ "async-lock", "async-recursion", @@ -1856,7 +1855,7 @@ dependencies = [ [[package]] name = "zarrs_tools" -version = "0.5.0" +version = "0.5.1" dependencies = [ "approx", "async-scoped", diff --git a/Cargo.toml b/Cargo.toml index 3fd712b..3b56ef1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zarrs_tools" -version = "0.5.0" +version = "0.5.1" authors = ["Lachlan Deakin "] edition = "2021" rust-version = "1.75" @@ -43,7 +43,7 @@ sysinfo = "0.30.6" tempfile = "3.10.1" thiserror = "1.0.57" tokio = { version = "1.34.0", features = ["macros", "rt-multi-thread"] } -zarrs = { version = "0.15.0-beta.1", features = [] } +zarrs = { version = "0.15.0-beta.2", features = [] } [[bin]] name = "zarrs_benchmark_read_sync" @@ -101,6 +101,6 @@ strip = true # aarch64-apple-darwin = "macos-14" # x86_64-apple-darwin = "macos-12" -# [patch.crates-io] +[patch.crates-io] # zarrs = { path = "../zarrs" } -# zarrs = { git = "https://github.com/LDeakin/zarrs.git" } +zarrs = { git = "https://github.com/LDeakin/zarrs.git" } diff --git a/src/bin/zarrs_info.rs b/src/bin/zarrs_info.rs index 868b6a0..899d033 100644 --- a/src/bin/zarrs_info.rs +++ b/src/bin/zarrs_info.rs @@ -6,6 +6,7 @@ use serde::Serialize; use serde_json::Number; use zarrs::{ array::{Array, ArrayMetadataOptions, DimensionName, FillValueMetadata}, + group::{Group, GroupMetadataOptions}, metadata::Metadata, storage::store::FilesystemStore, }; @@ -31,32 +32,32 @@ struct Cli { command: InfoCommand, } -#[derive(Parser)] +#[derive(Parser, Debug)] struct HistogramParams { n_bins: usize, min: f64, max: f64, } -#[derive(Subcommand)] +#[derive(Subcommand, Debug)] enum InfoCommand { - /// The metadata. + /// The array/group metadata. Metadata, - /// The metadata (interpreted as V3). + /// The array/group metadata (interpreted as V3). MetadataV3, + /// The array/group attributes. + Attributes, /// The array shape. Shape, /// The array data type. DataType, /// The array fill value. FillValue, - /// The array attributes. - Attributes, - /// The dimension names. + /// The array dimension names. DimensionNames, - /// Range. + /// The array range. Range, - /// Histogram. + /// The array histogram. Histogram(HistogramParams), } @@ -69,28 +70,59 @@ fn main() -> std::process::ExitCode { } } +fn group_metadata_options_v3() -> GroupMetadataOptions { + let mut metadata_options = GroupMetadataOptions::default(); + metadata_options.set_metadata_convert_version(zarrs::metadata::MetadataConvertVersion::V3); + metadata_options +} + +fn array_metadata_options_v3() -> ArrayMetadataOptions { + let mut metadata_options = ArrayMetadataOptions::default(); + metadata_options.set_metadata_convert_version(zarrs::metadata::MetadataConvertVersion::V3); + metadata_options.set_include_zarrs_metadata(false); + metadata_options +} + fn run() -> Result<(), Box> { let cli = Cli::parse(); let start = std::time::Instant::now(); - let storage = Arc::new(FilesystemStore::new(&cli.path).unwrap()); - let array = Array::open(storage, "/").unwrap(); + let storage = Arc::new(FilesystemStore::new(&cli.path)?); + // Group handling + let group = Group::open(storage.clone(), "/"); + if let Ok(group) = group { + match cli.command { + InfoCommand::Metadata => { + println!("{}", serde_json::to_string_pretty(group.metadata())?); + } + InfoCommand::MetadataV3 => { + let metadata = group.metadata_opt(&group_metadata_options_v3()); + println!("{}", serde_json::to_string_pretty(&metadata)?); + } + InfoCommand::Attributes => { + println!("{}", serde_json::to_string_pretty(group.attributes())?); + } + _ => { + println!("The {:?} command is not supported for a group", cli.command) + } + } + return Ok(()); + } + + // Array handling + let array = Array::open(storage.clone(), "/")?; match cli.command { InfoCommand::Metadata => { - println!( - "{}", - serde_json::to_string_pretty(array.metadata()).unwrap() - ); + println!("{}", serde_json::to_string_pretty(array.metadata())?); } InfoCommand::MetadataV3 => { - let mut metadata_options = ArrayMetadataOptions::default(); - metadata_options - .set_metadata_convert_version(zarrs::metadata::MetadataConvertVersion::V3); - metadata_options.set_include_zarrs_metadata(false); - let metadata = array.metadata_opt(&metadata_options); - println!("{}", serde_json::to_string_pretty(&metadata).unwrap()); + let metadata = array.metadata_opt(&array_metadata_options_v3()); + println!("{}", serde_json::to_string_pretty(&metadata)?); + } + InfoCommand::Attributes => { + println!("{}", serde_json::to_string_pretty(array.attributes())?); } InfoCommand::Shape => { #[derive(Serialize)] @@ -101,8 +133,7 @@ fn run() -> Result<(), Box> { "{}", serde_json::to_string_pretty(&Shape { shape: array.shape().to_vec() - }) - .unwrap() + })? ); } InfoCommand::DataType => { @@ -114,8 +145,7 @@ fn run() -> Result<(), Box> { "{}", serde_json::to_string_pretty(&DataType { data_type: array.data_type().metadata() - }) - .unwrap() + })? ); } InfoCommand::FillValue => { @@ -127,8 +157,7 @@ fn run() -> Result<(), Box> { "{}", serde_json::to_string_pretty(&FillValue { fill_value: array.data_type().metadata_fill_value(array.fill_value()) - }) - .unwrap() + })? ); } InfoCommand::DimensionNames => { @@ -140,21 +169,7 @@ fn run() -> Result<(), Box> { "{}", serde_json::to_string_pretty(&DimensionNames { dimension_names: array.dimension_names().clone() - }) - .unwrap() - ); - } - InfoCommand::Attributes => { - #[derive(Serialize)] - struct Attributes { - attributes: serde_json::Map, - } - println!( - "{}", - serde_json::to_string_pretty(&Attributes { - attributes: array.attributes().clone() - }) - .unwrap() + })? ); } InfoCommand::Range => { @@ -164,10 +179,7 @@ fn run() -> Result<(), Box> { min: Number, max: Number, } - println!( - "{}", - serde_json::to_string_pretty(&MinMax { min, max }).unwrap() - ); + println!("{}", serde_json::to_string_pretty(&MinMax { min, max })?); } InfoCommand::Histogram(histogram_params) => { let (bin_edges, hist) = zarrs_tools::info::calculate_histogram( @@ -184,7 +196,7 @@ fn run() -> Result<(), Box> { } println!( "{}", - serde_json::to_string_pretty(&Histogram { bin_edges, hist }).unwrap() + serde_json::to_string_pretty(&Histogram { bin_edges, hist })? ); } }