use super::Version;
use crate::coding::{Decode, DecodeError, Encode, EncodeError, KeyValuePairs};
#[derive(Debug)]
pub struct Server {
pub version: Version,
pub params: KeyValuePairs,
}
impl Decode for Server {
fn decode<R: bytes::Buf>(r: &mut R) -> Result<Self, DecodeError> {
let typ = u64::decode(r)?;
if typ != 0x21 {
return Err(DecodeError::InvalidMessage(typ));
}
let _len = u16::decode(r)?;
let version = Version::decode(r)?;
let params = KeyValuePairs::decode(r)?;
Ok(Self { version, params })
}
}
impl Encode for Server {
fn encode<W: bytes::BufMut>(&self, w: &mut W) -> Result<(), EncodeError> {
(0x21_u64).encode(w)?;
let mut buf = Vec::new();
self.version.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;
use bytes::BytesMut;
#[test]
fn encode_decode() {
let mut buf = BytesMut::new();
let mut params = KeyValuePairs::default();
params.set_intvalue(ParameterType::MaxRequestId.into(), 1000);
let server = Server {
version: Version::DRAFT_14,
params,
};
server.encode(&mut buf).unwrap();
#[rustfmt::skip]
assert_eq!(
buf.to_vec(),
vec![
0x21, 0x00, 0x0c, 0xC0, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x0E, 0x01, 0x02, 0x43, 0xe8, ]
);
let decoded = Server::decode(&mut buf).unwrap();
assert_eq!(decoded.version, server.version);
assert_eq!(decoded.params, server.params);
}
}