kitsune2_api/
protocol.rs

1//! Kitsune2 wire protocol types.
2
3use crate::*;
4
5pub(crate) mod proto {
6    include!("../proto/gen/kitsune2.wire.rs");
7}
8
9pub use proto::{k2_proto::K2WireType, K2Proto};
10
11impl K2Proto {
12    /// Decode this message from a byte array.
13    pub fn decode(bytes: &[u8]) -> K2Result<Self> {
14        prost::Message::decode(std::io::Cursor::new(bytes)).map_err(|err| {
15            K2Error::other_src("Failed to decode K2Proto Message", err)
16        })
17    }
18
19    /// Encode this message as a bytes::Bytes buffer.
20    pub fn encode(&self) -> K2Result<bytes::Bytes> {
21        let mut out = bytes::BytesMut::new();
22
23        prost::Message::encode(self, &mut out).map_err(|err| {
24            K2Error::other_src("Failed to encode K2Proto Message", err)
25        })?;
26
27        Ok(out.freeze())
28    }
29}
30
31#[cfg(test)]
32mod test {
33    use super::*;
34
35    #[test]
36    fn happy_encode_decode() {
37        use prost::Message;
38
39        let m = K2Proto {
40            ty: K2WireType::Module as i32,
41            data: bytes::Bytes::from_static(b"a"),
42            space: Some(bytes::Bytes::from_static(b"b")),
43            module: Some("c".into()),
44        };
45
46        let m_enc = m.encode_to_vec();
47
48        let d = K2Proto {
49            ty: K2WireType::Disconnect as i32,
50            data: bytes::Bytes::from_static(b"d"),
51            space: None,
52            module: None,
53        };
54
55        let d_enc = d.encode_to_vec();
56
57        // the disconnect message doesn't have a space or module,
58        // the encoded message should be smaller.
59        assert!(d_enc.len() < m_enc.len());
60
61        let m_dec = K2Proto::decode(&m_enc).unwrap();
62
63        assert_eq!(m, m_dec);
64
65        let d_dec = K2Proto::decode(&d_enc).unwrap();
66
67        assert_eq!(d, d_dec);
68    }
69}