queen/net/
codec.rs

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}