aboutsummaryrefslogtreecommitdiff
path: root/src/message/signalproxy/objects/ircchannel.rs
blob: b15d789976c7862c6b656ceaa39ff8d866e3eb3a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
use std::collections::HashMap;

use crate::primitive::{StringList, Variant, VariantMap};

#[allow(unused_imports)]
use crate::message::signalproxy::Network;

#[allow(dead_code)]
#[derive(Debug, Clone, PartialEq)]
pub struct IrcChannel {
    channel_modes_a: HashMap<char, StringList>,
    channel_modes_b: HashMap<char, String>,
    channel_modes_c: HashMap<char, String>,
    channel_modes_d: String,
    user_modes: HashMap<String, String>,
    name: String,
    topic: String,
    password: String,
    encrypted: bool,
}

impl Network for IrcChannel {
    type Item = VariantMap;

    fn to_network(&self) -> Self::Item {
        let mut res = VariantMap::new();

        res.insert(
            s!("ChanModes"),
            Variant::VariantList({
                let mut map = VariantMap::new();

                map.insert(
                    s!("A"),
                    Variant::VariantMap(
                        self.channel_modes_a
                            .iter()
                            .map(|(k, v)| (k.to_string(), Variant::StringList(v.clone())))
                            .collect(),
                    ),
                );
                map.insert(
                    s!("B"),
                    Variant::VariantMap(
                        self.channel_modes_b
                            .iter()
                            .map(|(k, v)| (k.to_string(), Variant::String(v.clone())))
                            .collect(),
                    ),
                );
                map.insert(
                    s!("C"),
                    Variant::VariantMap(
                        self.channel_modes_c
                            .iter()
                            .map(|(k, v)| (k.to_string(), Variant::String(v.clone())))
                            .collect(),
                    ),
                );
                map.insert(s!("D"), Variant::String(self.channel_modes_d.clone()));

                vec![Variant::VariantMap(map)]
            }),
        );

        res.insert(
            s!("UserModes"),
            Variant::VariantList(vec![Variant::VariantMap(
                self.user_modes
                    .iter()
                    .map(|(k, v)| (k.clone(), Variant::String(v.clone())))
                    .collect(),
            )]),
        );
        res.insert(
            s!("name"),
            Variant::VariantList(vec![Variant::String(self.name.clone())]),
        );
        res.insert(
            s!("topic"),
            Variant::VariantList(vec![Variant::String(self.topic.clone())]),
        );
        res.insert(
            s!("password"),
            Variant::VariantList(vec![Variant::String(self.password.clone())]),
        );
        res.insert(
            s!("encrypted"),
            Variant::VariantList(vec![Variant::bool(self.encrypted.clone())]),
        );

        res
    }
    fn from_network(input: &mut Self::Item) -> Self {
        Self {
            channel_modes_a: match_variant!(
                match_variant!(
                    match_variant!(input.get("ChanModes").unwrap(), Variant::VariantList)[0],
                    Variant::VariantMap
                )
                .get("B")
                .unwrap(),
                Variant::VariantMap
            )
            .iter()
            .map(|(k, v)| {
                (
                    k.chars().nth(0).unwrap(),
                    match_variant!(v, Variant::StringList),
                )
            })
            .collect(),
            channel_modes_b: match_variant!(
                match_variant!(
                    match_variant!(input.get("ChanModes").unwrap(), Variant::VariantList)[0],
                    Variant::VariantMap
                )
                .get("B")
                .unwrap(),
                Variant::VariantMap
            )
            .iter()
            .map(|(k, v)| {
                (
                    k.chars().nth(0).unwrap(),
                    match_variant!(v, Variant::String),
                )
            })
            .collect(),
            channel_modes_c: match_variant!(
                match_variant!(
                    match_variant!(input.get("ChanModes").unwrap(), Variant::VariantList)[0],
                    Variant::VariantMap
                )
                .get("C")
                .unwrap(),
                Variant::VariantMap
            )
            .iter()
            .map(|(k, v)| {
                (
                    k.chars().nth(0).unwrap(),
                    match_variant!(v, Variant::String),
                )
            })
            .collect(),
            channel_modes_d: match_variant!(
                match_variant!(
                    match_variant!(input.get("ChanModes").unwrap(), Variant::VariantList)[0],
                    Variant::VariantMap
                )
                .get("D")
                .unwrap(),
                Variant::String
            ),
            user_modes: match_variant!(
                match_variant!(input.get("UserModes").unwrap(), Variant::VariantList)[0],
                Variant::VariantMap
            )
            .iter()
            .map(|(k, v)| (k.clone(), match_variant!(v, Variant::String)))
            .collect(),
            name: match_variant!(
                match_variant!(input.get("name").unwrap(), Variant::VariantList)[0],
                Variant::String
            ),
            topic: match_variant!(
                match_variant!(input.get("topic").unwrap(), Variant::VariantList)[0],
                Variant::String
            ),
            password: match_variant!(
                match_variant!(input.get("password").unwrap(), Variant::VariantList)[0],
                Variant::String
            ),
            encrypted: match_variant!(
                match_variant!(input.get("encrypted").unwrap(), Variant::VariantList)[0],
                Variant::bool
            ),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    fn get_network() -> VariantMap {
        VariantMap::from(map! {
            s!("encrypted") => Variant::VariantList(
                vec![
                    Variant::bool(
                        false,
                    ),
                ],
            ),
            s!("topic") => Variant::VariantList(
                vec![
                    Variant::String(
                        s!(""),
                    ),
                ],
            ),
            s!("password") => Variant::VariantList(
                vec![
                    Variant::String(
                        s!(""),
                    ),
                ],
            ),
            s!("ChanModes") => Variant::VariantList(
                vec![
                    Variant::VariantMap(map!
                        {
                            s!("B") => Variant::VariantMap(map!
                                {},
                            ),
                            s!("D") => Variant::String(
                                s!("tCnT"),
                            ),
                            s!("C") => Variant::VariantMap(map!
                                {
                                    s!("j") => Variant::String(
                                        s!("5:1"),
                                    ),
                                    s!("x") => Variant::String(
                                        s!("10:5"),
                                    ),
                                    s!("f") => Variant::String(
                                        s!("30:5"),
                                    ),
                                    s!("F") => Variant::String(
                                        s!("5:60"),
                                    ),
                                },
                            ),
                            s!("A") => Variant::VariantMap(map!
                                {},
                            ),
                        },
                    ),
                ],
            ),
            s!("UserModes") => Variant::VariantList(
                vec![
                    Variant::VariantMap(map!
                        {
                            s!("audron") => Variant::String(
                                s!("o"),
                            ),
                            s!("audron_") => Variant::String(
                                s!(""),
                            ),
                        },
                    ),
                ],
            ),
            s!("name") => Variant::VariantList(
                vec![
                    Variant::String(
                        s!("#audron-test"),
                    ),
                ],
            )
        })
    }
    fn get_runtime() -> IrcChannel {
        IrcChannel {
            channel_modes_a: map! {},
            channel_modes_b: map! {},
            channel_modes_c: map! { 'j' => s!("5:1"), 'x' => s!("10:5"), 'f' => s!("30:5"), 'F' => s!("5:60") },
            channel_modes_d: s!("tCnT"),
            user_modes: map! { s!("audron") => s!("o"), s!("audron_") => s!("") },
            name: s!("#audron-test"),
            topic: s!(""),
            password: s!(""),
            encrypted: false,
        }
    }

    #[test]
    fn ircchannel_to_network() {
        assert_eq!(get_runtime().to_network(), get_network())
    }

    #[test]
    fn ircchannel_from_network() {
        assert_eq!(IrcChannel::from_network(&mut get_network()), get_runtime())
    }
}