1use numcodecs::{
21 AnyArray, AnyArrayView, AnyArrayViewMut, AnyCowArray, Codec, DynCodec, ErasedDynCodec,
22 ErasedError, StaticCodec, StaticCodecConfig, StaticCodecVersion,
23};
24use numcodecs_registry::GlobalRegistry;
25use schemars::JsonSchema;
26use serde::{Deserialize, Serialize};
27use thiserror::Error;
28
29#[derive(Clone, Serialize, Deserialize, JsonSchema)]
30#[serde(deny_unknown_fields)]
31pub struct OnionCodec {
35 #[serde(serialize_with = "DynCodec::get_config")]
37 #[serde(deserialize_with = "GlobalRegistry::codec_from_config")]
38 #[schemars(schema_with = "ErasedDynCodec::codec_config_schema")]
39 pub codec: ErasedDynCodec,
40 #[serde(default, rename = "_version")]
42 pub version: StaticCodecVersion<1, 0, 0>,
43}
44
45impl Codec for OnionCodec {
46 type Error = OnionCodecError;
47
48 fn encode(&self, data: AnyCowArray) -> Result<AnyArray, Self::Error> {
49 self.codec
50 .encode(data)
51 .map_err(|err| OnionCodecError { error: err })
52 }
53
54 fn decode(&self, encoded: AnyCowArray) -> Result<AnyArray, Self::Error> {
55 self.codec
56 .decode(encoded)
57 .map_err(|err| OnionCodecError { error: err })
58 }
59
60 fn decode_into(
61 &self,
62 encoded: AnyArrayView,
63 decoded: AnyArrayViewMut,
64 ) -> Result<(), Self::Error> {
65 self.codec
66 .decode_into(encoded, decoded)
67 .map_err(|err| OnionCodecError { error: err })
68 }
69}
70
71impl StaticCodec for OnionCodec {
72 const CODEC_ID: &'static str = "onion.rs";
73
74 type Config<'de> = Self;
75
76 fn from_config(config: Self::Config<'_>) -> Self {
77 config
78 }
79
80 fn get_config(&self) -> StaticCodecConfig<'_, Self> {
81 StaticCodecConfig::from(self)
82 }
83}
84
85#[derive(Debug, Error)]
86#[error(transparent)]
88pub struct OnionCodecError {
89 error: ErasedError,
90}
91
92numcodecs_registry::export_global! {
94 static REGISTRY: numcodecs_registry::EmptyRegistry = numcodecs_registry::EmptyRegistry;
95}