moq_transport/setup/
client.rs1use super::Versions;
2use crate::coding::{Decode, DecodeError, Encode, EncodeError, KeyValuePairs};
3
4#[derive(Debug)]
8pub struct Client {
9 pub versions: Versions,
11
12 pub params: KeyValuePairs,
15}
16
17impl Decode for Client {
18 fn decode<R: bytes::Buf>(r: &mut R) -> Result<Self, DecodeError> {
20 let typ = u64::decode(r)?;
21 if typ != 0x20 {
22 return Err(DecodeError::InvalidMessage(typ));
24 }
25
26 let _len = u16::decode(r)?;
27 let versions = Versions::decode(r)?;
30 let params = KeyValuePairs::decode(r)?;
31
32 Ok(Self { versions, params })
33 }
34}
35
36impl Encode for Client {
37 fn encode<W: bytes::BufMut>(&self, w: &mut W) -> Result<(), EncodeError> {
39 (0x20_u64).encode(w)?; let mut buf = Vec::new();
47
48 self.versions.encode(&mut buf).unwrap();
49 self.params.encode(&mut buf).unwrap();
50
51 if buf.len() > u16::MAX as usize {
53 return Err(EncodeError::MsgBoundsExceeded);
54 }
55 (buf.len() as u16).encode(w)?;
56
57 Self::encode_remaining(w, buf.len())?;
60 w.put_slice(&buf);
61
62 Ok(())
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use super::*;
69 use crate::setup::{ParameterType, Version};
70 use bytes::BytesMut;
71
72 #[test]
73 fn encode_decode() {
74 let mut buf = BytesMut::new();
75
76 let mut params = KeyValuePairs::default();
77 params.set_bytesvalue(ParameterType::Path.into(), "testpath".as_bytes().to_vec());
78
79 let client = Client {
80 versions: [Version::DRAFT_13].into(),
81 params,
82 };
83 client.encode(&mut buf).unwrap();
84
85 #[rustfmt::skip]
86 assert_eq!(
87 buf.to_vec(),
88 vec![
89 0x20, 0x00, 0x14, 0x01, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0D, 0x01, 0x01, 0x08, 0x74, 0x65, 0x73, 0x74, 0x70, 0x61, 0x74, 0x68, ]
96 );
97 let decoded = Client::decode(&mut buf).unwrap();
98 assert_eq!(decoded.versions, client.versions);
99 assert_eq!(decoded.params, client.params);
100 }
101}