1use crate::{CodecError, CodecId};
14use zeroize::Zeroize;
15
16pub trait DntCodec: Send + Sync {
18 fn codec_id(&self) -> CodecId;
20 fn matches_codec_id(&self, codec_id: &CodecId) -> bool {
22 self.codec_id() == *codec_id
23 }
24 fn encode(&self, value: &[u8]) -> Result<Vec<u8>, CodecError>;
26 fn decode(&self, payload: &[u8]) -> Result<Vec<u8>, CodecError>;
28 fn decode_owned(&self, mut payload: Vec<u8>) -> Result<Vec<u8>, CodecError> {
34 let decoded = self.decode(&payload);
35 payload.zeroize();
36 decoded
37 }
38}
39
40#[derive(Debug, Clone, Copy, Default)]
42pub struct BytesCodec;
43
44impl DntCodec for BytesCodec {
45 fn codec_id(&self) -> CodecId {
46 CodecId::new("bytes").expect("static codec id")
48 }
49
50 fn matches_codec_id(&self, codec_id: &CodecId) -> bool {
51 codec_id.as_str() == "bytes"
52 }
53
54 fn encode(&self, value: &[u8]) -> Result<Vec<u8>, CodecError> {
55 Ok(value.to_vec())
56 }
57
58 fn decode(&self, payload: &[u8]) -> Result<Vec<u8>, CodecError> {
59 Ok(payload.to_vec())
60 }
61
62 fn decode_owned(&self, payload: Vec<u8>) -> Result<Vec<u8>, CodecError> {
63 Ok(payload)
64 }
65}
66
67#[derive(Debug, Clone, Copy, Default)]
69pub struct IdentityJsonCodec;
70
71impl DntCodec for IdentityJsonCodec {
72 fn codec_id(&self) -> CodecId {
73 CodecId::new("json").expect("static codec id")
75 }
76
77 fn matches_codec_id(&self, codec_id: &CodecId) -> bool {
78 codec_id.as_str() == "json"
79 }
80
81 fn encode(&self, value: &[u8]) -> Result<Vec<u8>, CodecError> {
82 Ok(value.to_vec())
83 }
84
85 fn decode(&self, payload: &[u8]) -> Result<Vec<u8>, CodecError> {
86 Ok(payload.to_vec())
87 }
88
89 fn decode_owned(&self, payload: Vec<u8>) -> Result<Vec<u8>, CodecError> {
90 Ok(payload)
91 }
92}