use crate::error::ProtocolError;
use crate::primitive::{StringList, Variant, VariantMap};
use crate::{HandshakeDeserialize, HandshakeSerialize};
use failure::Error;
#[derive(Debug)]
pub struct ClientInit {
pub client_version: String,
pub client_date: String,
pub client_features: u32,
pub feature_list: StringList,
}
impl HandshakeSerialize for ClientInit {
fn serialize(&self) -> Result<Vec<u8>, Error> {
let mut values: VariantMap = VariantMap::with_capacity(5);
values.insert(
"MsgType".to_string(),
Variant::String("ClientInit".to_string()),
);
values.insert(
"ClientVersion".to_string(),
Variant::String(self.client_version.clone()),
);
values.insert(
"ClientDate".to_string(),
Variant::String(self.client_date.clone()),
);
values.insert("Features".to_string(), Variant::u32(self.client_features));
values.insert(
"FeatureList".to_string(),
Variant::StringList(self.feature_list.clone()),
);
return HandshakeSerialize::serialize(&values);
}
}
impl HandshakeDeserialize for ClientInit {
fn parse(b: &[u8]) -> Result<(usize, Self), Error> {
let (len, values): (usize, VariantMap) = HandshakeDeserialize::parse(b)?;
let msgtype = match_variant!(&values["MsgType"], Variant::StringUTF8);
if msgtype == "ClientInit" {
return Ok((
len,
Self {
client_version: match_variant!(values["ClientVersion"], Variant::String),
client_date: match_variant!(values["ClientDate"], Variant::String),
feature_list: match_variant!(values["FeatureList"], Variant::StringList),
client_features: match_variant!(values["Features"], Variant::u32),
},
));
} else {
bail!(ProtocolError::WrongMsgType);
}
}
}