use derive_more::{Display, From};
use serde::{Deserialize, Serialize};
use zarrs_metadata::v3::MetadataV3;
use zarrs_metadata::ConfigurationSerialize;
#[derive(Serialize, Deserialize, Clone, Eq, PartialEq, Debug, Display, From)]
#[non_exhaustive]
#[serde(untagged)]
pub enum OptionalCodecConfiguration {
V1(OptionalCodecConfigurationV1),
}
impl ConfigurationSerialize for OptionalCodecConfiguration {}
#[derive(Serialize, Deserialize, Clone, Eq, PartialEq, Debug, Display)]
#[serde(deny_unknown_fields)]
#[display("{}", serde_json::to_string(self).unwrap_or_default())]
pub struct OptionalCodecConfigurationV1 {
pub mask_codecs: Vec<MetadataV3>,
pub data_codecs: Vec<MetadataV3>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn optional_simple() {
let configuration = serde_json::from_str::<OptionalCodecConfigurationV1>(
r#"
{
"mask_codecs": [
{
"name": "packbits",
"configuration": {}
}
],
"data_codecs": [
{
"name": "bytes",
"configuration": {}
}
]
}
"#,
)
.unwrap();
assert_eq!(configuration.mask_codecs.len(), 1);
assert_eq!(configuration.data_codecs.len(), 1);
}
#[test]
fn optional_with_compression() {
let configuration = serde_json::from_str::<OptionalCodecConfigurationV1>(
r#"
{
"mask_codecs": [
{
"name": "packbits",
"configuration": {}
},
{
"name": "gzip",
"configuration": {"level": 5}
}
],
"data_codecs": [
{
"name": "bytes",
"configuration": {"endian": "little"}
},
{
"name": "gzip",
"configuration": {"level": 5}
}
]
}
"#,
)
.unwrap();
assert_eq!(configuration.mask_codecs.len(), 2);
assert_eq!(configuration.data_codecs.len(), 2);
}
#[test]
fn optional_missing_mask_codecs() {
let config = r#"
{
"data_codecs": []
}
"#;
assert!(serde_json::from_str::<OptionalCodecConfigurationV1>(config).is_err());
}
#[test]
fn optional_missing_data_codecs() {
let config = r#"
{
"mask_codecs": []
}
"#;
assert!(serde_json::from_str::<OptionalCodecConfigurationV1>(config).is_err());
}
}