use numcodecs::{
AnyArray, AnyArrayView, AnyArrayViewMut, AnyCowArray, Codec, DynCodec, ErasedDynCodec,
ErasedError, StaticCodec, StaticCodecConfig, StaticCodecVersion,
};
use numcodecs_registry::GlobalRegistry;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Clone, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct OnionCodec {
#[serde(serialize_with = "DynCodec::get_config")]
#[serde(deserialize_with = "GlobalRegistry::codec_from_config")]
#[schemars(schema_with = "ErasedDynCodec::codec_config_schema")]
pub codec: ErasedDynCodec,
#[serde(default, rename = "_version")]
pub version: StaticCodecVersion<1, 0, 0>,
}
impl Codec for OnionCodec {
type Error = OnionCodecError;
fn encode(&self, data: AnyCowArray) -> Result<AnyArray, Self::Error> {
self.codec
.encode(data)
.map_err(|err| OnionCodecError { error: err })
}
fn decode(&self, encoded: AnyCowArray) -> Result<AnyArray, Self::Error> {
self.codec
.decode(encoded)
.map_err(|err| OnionCodecError { error: err })
}
fn decode_into(
&self,
encoded: AnyArrayView,
decoded: AnyArrayViewMut,
) -> Result<(), Self::Error> {
self.codec
.decode_into(encoded, decoded)
.map_err(|err| OnionCodecError { error: err })
}
}
impl StaticCodec for OnionCodec {
const CODEC_ID: &'static str = "onion.rs";
type Config<'de> = Self;
fn from_config(config: Self::Config<'_>) -> Self {
config
}
fn get_config(&self) -> StaticCodecConfig<'_, Self> {
StaticCodecConfig::from(self)
}
}
#[derive(Debug, Error)]
#[error(transparent)]
pub struct OnionCodecError {
error: ErasedError,
}