use thiserror::Error;
#[derive(Debug, Clone, PartialEq, Error)]
pub enum CodecError {
#[error("Encode error: {0}")]
Encode(String),
#[error("Decode error: {0}")]
Decode(String),
}
pub trait Codec<T> {
fn encode(d: &T) -> Result<Vec<u8>, CodecError>;
fn decode(e: &[u8]) -> Result<T, CodecError>;
}
pub trait CodecName {
fn name() -> &'static str;
}
pub struct PassthroughCodec;
impl CodecName for PassthroughCodec {
fn name() -> &'static str {
"native"
}
}
impl<T: Send + Sync + 'static> Codec<T> for PassthroughCodec {
fn encode(_: &T) -> Result<Vec<u8>, CodecError> {
Err(CodecError::Encode("PassthroughCodec cannot encode".into()))
}
fn decode(_: &[u8]) -> Result<T, CodecError> {
Err(CodecError::Decode("PassthroughCodec cannot decode".into()))
}
}
#[derive(Debug, Clone)]
pub struct TextCodec;
impl CodecName for TextCodec {
fn name() -> &'static str {
"text"
}
}
impl Codec<String> for TextCodec {
fn encode(d: &String) -> Result<Vec<u8>, CodecError> {
Ok(d.as_bytes().to_vec())
}
fn decode(e: &[u8]) -> Result<String, CodecError> {
String::from_utf8(e.to_vec()).map_err(|e| CodecError::Decode(e.to_string()))
}
}