1use mco::err;
2use mco::std::errors::Error;
3use serde::de::DeserializeOwned;
4use serde::Serialize;
5
6#[derive(Debug)]
7pub enum Codecs {
8 BinCodec(BinCodec),
9 JsonCodec(JsonCodec),
10}
11
12impl Default for Codecs {
13 fn default() -> Self {
14 Self::BinCodec(BinCodec {})
15 }
16}
17
18pub trait Codec {
19 fn encode<T: Serialize>(&self, arg: T) -> Result<Vec<u8>, Error>;
20 fn decode<T: DeserializeOwned>(&self, arg: &[u8]) -> Result<T, Error>;
21}
22
23#[derive(Debug)]
24pub struct JsonCodec {}
25
26impl Codec for JsonCodec {
27 fn encode<T: Serialize>(&self, arg: T) -> Result<Vec<u8>, Error> {
28 match serde_json::to_vec(&arg) {
29 Ok(ok) => { Ok(ok) }
30 Err(e) => { Err(err!("{}",e)) }
31 }
32 }
33
34 fn decode<T: DeserializeOwned>(&self, arg: &[u8]) -> Result<T, Error> {
35 match serde_json::from_slice(arg) {
36 Ok(v) => {
37 Ok(v)
38 }
39 Err(e) => {
40 Err(err!("{}",e))
41 }
42 }
43 }
44}
45
46#[derive(Debug)]
47pub struct BinCodec {}
48
49impl Codec for BinCodec {
50 fn encode<T: Serialize>(&self, arg: T) -> Result<Vec<u8>, Error> {
51 match bincode::serialize(&arg) {
52 Ok(ok) => { Ok(ok) }
53 Err(e) => { Err(err!("{}",e)) }
54 }
55 }
56
57 fn decode<T: DeserializeOwned>(&self, arg: &[u8]) -> Result<T, Error> {
58 match bincode::deserialize(arg) {
59 Ok(ok) => { Ok(ok) }
60 Err(e) => { Err(err!("{}",e)) }
61 }
62 }
63}
64
65impl Codec for Codecs {
66 fn encode<T: Serialize>(&self, arg: T) -> Result<Vec<u8>, Error> {
67 match self {
68 Codecs::BinCodec(s) => { s.encode(arg) }
69 Codecs::JsonCodec(s) => { s.encode(arg) }
70 }
71 }
72
73 fn decode<T: DeserializeOwned>(&self, arg: &[u8]) -> Result<T, Error> {
74 match self {
75 Codecs::BinCodec(s) => { s.decode(arg) }
76 Codecs::JsonCodec(s) => { s.decode(arg) }
77 }
78 }
79}