use std::sync::Arc;
use pluot_core::numeric_data::NumericData;
use zarrs::storage::AsyncReadableStorageTraits;
pub async fn load_arr_as_numeric_data(
store: Arc<dyn AsyncReadableStorageTraits>,
array_path: &str,
) -> Result<NumericData, zarrs::array::ArrayError> {
let array = zarrs::array::Array::async_open(store, array_path)
.await
.unwrap();
let subset = array.subset_all();
use zarrs::plugin::ZarrVersion;
let dtype_name = array
.data_type()
.name(ZarrVersion::V3)
.expect("Array data type must have a V3 name")
.to_string();
macro_rules! load {
($rust_ty:ty, $variant:ident) => {{
let data = array
.async_retrieve_array_subset::<Vec<$rust_ty>>(&subset)
.await?;
NumericData::$variant(Arc::new(data))
}};
}
Ok(match dtype_name.as_str() {
"uint8" => load!(u8, Uint8),
"uint16" => load!(u16, Uint16),
"uint32" => load!(u32, Uint32),
"uint64" => load!(u64, Uint64),
"int8" => load!(i8, Int8),
"int16" => load!(i16, Int16),
"int32" => load!(i32, Int32),
"int64" => load!(i64, Int64),
"float32" => load!(f32, Float32),
"float64" => load!(f64, Float64),
_ => panic!("Unsupported zarr data type for point coordinates: {}", dtype_name),
})
}