use serde::{Deserialize, Serialize};
use validatrix::{Accumulator, Validate};
use crate::{MaybeNDim, NDim};
use super::{Axis, CoordinateTransform, MultiscaleImageDataset, MultiscaleImageMetadata};
use crate::v0_4::multiscales::{valid_axes, valid_datasets, valid_transforms};
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct MultiscaleImage {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
pub axes: Vec<Axis>,
pub datasets: Vec<MultiscaleImageDataset>,
#[serde(skip_serializing_if = "Option::is_none")]
pub coordinate_transformations: Option<Vec<CoordinateTransform>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<MultiscaleImageMetadata>,
}
impl Validate for MultiscaleImage {
fn validate_inner(&self, accum: &mut Accumulator) {
accum.with_key("axes", |a| valid_axes(a, &self.axes));
accum.with_key("datasets", |a| {
valid_datasets(a, self.maybe_ndim(), &self.datasets);
});
if let Some(ct) = self.coordinate_transformations.as_ref() {
accum.with_key("coordinateTransformations", |a| {
valid_transforms(a, self.maybe_ndim(), ct);
});
}
}
}
impl NDim for MultiscaleImage {
fn ndim(&self) -> usize {
self.axes.len()
}
}
impl From<crate::v0_4::MultiscaleImage> for MultiscaleImage {
fn from(value: crate::v0_4::MultiscaleImage) -> Self {
Self {
name: value.name,
axes: value.axes,
datasets: value.datasets,
coordinate_transformations: value.coordinate_transformations,
r#type: value.r#type,
metadata: value.metadata,
}
}
}
#[cfg(test)]
mod tests {
use crate::v0_5::OmeZarrGroupMetadata;
use super::*;
#[test]
fn multiscales_example() {
let json = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/ome-zarr/specifications/0.5/examples/multiscales_strict/multiscales_example.json"
))
.lines()
.filter(|line| !line.contains("//")) .collect::<String>();
let ome_metadata: OmeZarrGroupMetadata = serde_json::from_str(&json).unwrap();
let _multiscales: Vec<MultiscaleImage> = ome_metadata.attributes.ome.multiscales.unwrap();
}
#[test]
fn multiscales_transformations() {
let json = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/ome-zarr/specifications/0.5/examples/multiscales_strict/multiscales_transformations.json"
));
let ome_metadata: OmeZarrGroupMetadata = serde_json::from_str(json).unwrap();
let _multiscales: Vec<MultiscaleImage> = ome_metadata.attributes.ome.multiscales.unwrap();
}
}