use crate::{CodecError, CodecId};
use zeroize::Zeroize;
pub trait DntCodec: Send + Sync {
fn codec_id(&self) -> CodecId;
fn matches_codec_id(&self, codec_id: &CodecId) -> bool {
self.codec_id() == *codec_id
}
fn encode(&self, value: &[u8]) -> Result<Vec<u8>, CodecError>;
fn decode(&self, payload: &[u8]) -> Result<Vec<u8>, CodecError>;
fn decode_owned(&self, mut payload: Vec<u8>) -> Result<Vec<u8>, CodecError> {
let decoded = self.decode(&payload);
payload.zeroize();
decoded
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct BytesCodec;
impl DntCodec for BytesCodec {
fn codec_id(&self) -> CodecId {
CodecId::new("bytes").expect("static codec id")
}
fn matches_codec_id(&self, codec_id: &CodecId) -> bool {
codec_id.as_str() == "bytes"
}
fn encode(&self, value: &[u8]) -> Result<Vec<u8>, CodecError> {
Ok(value.to_vec())
}
fn decode(&self, payload: &[u8]) -> Result<Vec<u8>, CodecError> {
Ok(payload.to_vec())
}
fn decode_owned(&self, payload: Vec<u8>) -> Result<Vec<u8>, CodecError> {
Ok(payload)
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct IdentityJsonCodec;
impl DntCodec for IdentityJsonCodec {
fn codec_id(&self) -> CodecId {
CodecId::new("json").expect("static codec id")
}
fn matches_codec_id(&self, codec_id: &CodecId) -> bool {
codec_id.as_str() == "json"
}
fn encode(&self, value: &[u8]) -> Result<Vec<u8>, CodecError> {
Ok(value.to_vec())
}
fn decode(&self, payload: &[u8]) -> Result<Vec<u8>, CodecError> {
Ok(payload.to_vec())
}
fn decode_owned(&self, payload: Vec<u8>) -> Result<Vec<u8>, CodecError> {
Ok(payload)
}
}