1use crate::crypto::Crypto;
2use crate::error::{Result, Error};
3use crate::nson::Message;
4
5pub trait Codec: Send + 'static {
6 fn new() -> Self;
7
8 fn decode(&mut self, crypto: &Option<Crypto>, bytes: Vec<u8>) -> Result<Message>;
9
10 fn encode(&mut self, crypto: &Option<Crypto>, message: Message) -> Result<Vec<u8>>;
11}
12
13pub struct NsonCodec;
14
15impl Codec for NsonCodec {
16 fn new() -> Self {
17 NsonCodec
18 }
19
20 fn decode(&mut self, crypto: &Option<Crypto>, mut bytes: Vec<u8>) -> Result<Message> {
21 if let Some(crypto) = &crypto {
22 crypto.decrypt(&mut bytes).map_err(|err|
23 Error::InvalidData(format!("{}", err))
24 )?;
25 }
26
27 let recv = Message::from_bytes(&bytes);
28
29 recv.map_err(|err| Error::InvalidData(format!("{}", err)))
30 }
31
32 fn encode(&mut self, crypto: &Option<Crypto>, message: Message) -> Result<Vec<u8>> {
33 let mut bytes = message.to_bytes().map_err(|err| Error::InvalidData(format!("{}", err)) )?;
34
35 if let Some(crypto) = &crypto {
36 crypto.encrypt(&mut bytes).map_err(|err|
37 Error::InvalidData(format!("{}", err))
38 )?;
39 }
40
41 Ok(bytes)
42 }
43}