libquassel/message/handshake/
sessioninit.rs1use crate::error::ProtocolError;
2use crate::primitive::{Variant, VariantList, VariantMap};
3use crate::{HandshakeDeserialize, HandshakeSerialize};
4
5use failure::Error;
6
7#[derive(Debug)]
10pub struct SessionInit {
11 identities: VariantList,
13 buffers: VariantList,
15 network_ids: VariantList,
17}
18
19impl HandshakeSerialize for SessionInit {
20 fn serialize(&self) -> Result<Vec<u8>, Error> {
21 let mut values: VariantMap = VariantMap::with_capacity(1);
22 values.insert(
23 "MsgType".to_string(),
24 Variant::String("SessionInit".to_string()),
25 );
26 values.insert(
27 "Identities".to_string(),
28 Variant::VariantList(self.identities.clone()),
29 );
30 values.insert(
31 "BufferInfos".to_string(),
32 Variant::VariantList(self.buffers.clone()),
33 );
34 values.insert(
35 "NetworkIds".to_string(),
36 Variant::VariantList(self.network_ids.clone()),
37 );
38 return HandshakeSerialize::serialize(&values);
39 }
40}
41
42impl HandshakeDeserialize for SessionInit {
43 fn parse(b: &[u8]) -> Result<(usize, Self), Error> {
44 let (len, values): (usize, VariantMap) = HandshakeDeserialize::parse(b)?;
45
46 let msgtype = match_variant!(&values["MsgType"], Variant::StringUTF8);
47
48 if msgtype == "ClientLogin" {
49 return Ok((
50 len,
51 Self {
52 identities: match_variant!(values["Identities"], Variant::VariantList),
53 buffers: match_variant!(values["BufferInfos"], Variant::VariantList),
54 network_ids: match_variant!(values["NetworkIds"], Variant::VariantList),
55 },
56 ));
57 } else {
58 bail!(ProtocolError::WrongMsgType);
59 }
60 }
61}