use derive_more::{Display, From};
use serde::{Deserialize, Serialize};
use zarrs_metadata::v3::MetadataV3;
use zarrs_metadata::{ChunkShape, ConfigurationSerialize};
#[derive(Serialize, Deserialize, Clone, Eq, PartialEq, Debug, Display, From)]
#[non_exhaustive]
#[serde(untagged)]
pub enum ShardingCodecConfiguration {
V1(ShardingCodecConfigurationV1),
}
impl ConfigurationSerialize for ShardingCodecConfiguration {}
#[derive(Serialize, Deserialize, Clone, Eq, PartialEq, Debug, Display)]
#[serde(deny_unknown_fields)]
#[display("{}", serde_json::to_string(self).unwrap_or_default())]
pub struct ShardingCodecConfigurationV1 {
pub chunk_shape: ChunkShape,
pub codecs: Vec<MetadataV3>,
pub index_codecs: Vec<MetadataV3>,
#[serde(default)]
pub index_location: ShardingIndexLocation,
}
#[derive(Serialize, Deserialize, Clone, Copy, Eq, PartialEq, Debug, Display, Default)]
#[serde(rename_all = "lowercase")]
pub enum ShardingIndexLocation {
Start,
#[default]
End,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn codec_sharding_configuration() {
const JSON: &str = r#"{
"chunk_shape": [2, 2],
"codecs": [
{
"name": "bytes",
"configuration": {
"endian": "little"
}
}
],
"index_codecs": [
{
"name": "bytes",
"configuration": {
"endian": "little"
}
}
]
}"#;
let config = serde_json::from_str::<ShardingCodecConfiguration>(JSON).unwrap();
assert_eq!(
config.to_string(),
r#"{"chunk_shape":[2,2],"codecs":[{"name":"bytes","configuration":{"endian":"little"}}],"index_codecs":[{"name":"bytes","configuration":{"endian":"little"}}],"index_location":"end"}"#
);
let ShardingCodecConfiguration::V1(config) = config;
assert_eq!(config.index_location, ShardingIndexLocation::End);
}
}