libquassel/message/handshake/
sessioninit.rs

1use crate::error::ProtocolError;
2use crate::primitive::{Variant, VariantList, VariantMap};
3use crate::{HandshakeDeserialize, HandshakeSerialize};
4
5use failure::Error;
6
7/// SessionInit is received along with ClientLoginAck to initialize that user Session
8// TODO Replace with proper types
9#[derive(Debug)]
10pub struct SessionInit {
11    /// List of all configured identities
12    identities: VariantList,
13    /// List of all existing buffers
14    buffers: VariantList,
15    /// Ids of all networks
16    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}