use super::Versions;
use crate::coding::{Decode, DecodeError, Encode, EncodeError, KeyValuePairs};
#[derive(Debug)]
pub struct Client {
pub versions: Versions,
pub params: KeyValuePairs,
}
impl Decode for Client {
fn decode<R: bytes::Buf>(r: &mut R) -> Result<Self, DecodeError> {
let typ = u64::decode(r)?;
if typ != 0x20 {
return Err(DecodeError::InvalidMessage(typ));
}
let _len = u16::decode(r)?;
let versions = Versions::decode(r)?;
let params = KeyValuePairs::decode(r)?;
Ok(Self { versions, params })
}
}
impl Encode for Client {
fn encode<W: bytes::BufMut>(&self, w: &mut W) -> Result<(), EncodeError> {
(0x20_u64).encode(w)?;
let mut buf = Vec::new();
self.versions.encode(&mut buf).unwrap();
self.params.encode(&mut buf).unwrap();
if buf.len() > u16::MAX as usize {
return Err(EncodeError::MsgBoundsExceeded);
}
(buf.len() as u16).encode(w)?;
Self::encode_remaining(w, buf.len())?;
w.put_slice(&buf);
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::setup::{ParameterType, Version};
use bytes::BytesMut;
#[test]
fn encode_decode() {
let mut buf = BytesMut::new();
let mut params = KeyValuePairs::default();
params.set_bytesvalue(ParameterType::Path.into(), "testpath".as_bytes().to_vec());
let client = Client {
versions: [Version::DRAFT_13].into(),
params,
};
client.encode(&mut buf).unwrap();
#[rustfmt::skip]
assert_eq!(
buf.to_vec(),
vec![
0x20, 0x00, 0x14, 0x01, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0D, 0x01, 0x01, 0x08, 0x74, 0x65, 0x73, 0x74, 0x70, 0x61, 0x74, 0x68, ]
);
let decoded = Client::decode(&mut buf).unwrap();
assert_eq!(decoded.versions, client.versions);
assert_eq!(decoded.params, client.params);
}
}