mco_rpc/
codec.rs

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}