moq_transport/setup/
server.rs1use super::Version;
2use crate::coding::{Decode, DecodeError, Encode, EncodeError, KeyValuePairs};
3
4#[derive(Debug)]
8pub struct Server {
9 pub version: Version,
11
12 pub params: KeyValuePairs,
15}
16
17impl Decode for Server {
18 fn decode<R: bytes::Buf>(r: &mut R) -> Result<Self, DecodeError> {
20 let typ = u64::decode(r)?;
21 if typ != 0x21 {
22 return Err(DecodeError::InvalidMessage(typ));
24 }
25
26 let _len = u16::decode(r)?;
27 let version = Version::decode(r)?;
30 let params = KeyValuePairs::decode(r)?;
31
32 Ok(Self { version, params })
33 }
34}
35
36impl Encode for Server {
37 fn encode<W: bytes::BufMut>(&self, w: &mut W) -> Result<(), EncodeError> {
38 (0x21_u64).encode(w)?; let mut buf = Vec::new();
46
47 self.version.encode(&mut buf).unwrap();
48 self.params.encode(&mut buf).unwrap();
49
50 if buf.len() > u16::MAX as usize {
52 return Err(EncodeError::MsgBoundsExceeded);
53 }
54 (buf.len() as u16).encode(w)?;
55
56 Self::encode_remaining(w, buf.len())?;
59 w.put_slice(&buf);
60
61 Ok(())
62 }
63}
64
65#[cfg(test)]
66mod tests {
67 use super::*;
68 use crate::setup::ParameterType;
69 use bytes::BytesMut;
70
71 #[test]
72 fn encode_decode() {
73 let mut buf = BytesMut::new();
74
75 let mut params = KeyValuePairs::default();
76 params.set_intvalue(ParameterType::MaxRequestId.into(), 1000);
77
78 let server = Server {
79 version: Version::DRAFT_14,
80 params,
81 };
82
83 server.encode(&mut buf).unwrap();
84
85 #[rustfmt::skip]
86 assert_eq!(
87 buf.to_vec(),
88 vec![
89 0x21, 0x00, 0x0c, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0E, 0x01, 0x02, 0x43, 0xe8, ]
95 );
96
97 let decoded = Server::decode(&mut buf).unwrap();
98 assert_eq!(decoded.version, server.version);
99 assert_eq!(decoded.params, server.params);
100 }
101}