aboutsummaryrefslogtreecommitdiff
path: root/src/message/signalproxy/objects/ircchannel.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/message/signalproxy/objects/ircchannel.rs289
1 files changed, 289 insertions, 0 deletions
diff --git a/src/message/signalproxy/objects/ircchannel.rs b/src/message/signalproxy/objects/ircchannel.rs
new file mode 100644
index 0000000..cd5cd3e
--- /dev/null
+++ b/src/message/signalproxy/objects/ircchannel.rs
@@ -0,0 +1,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: 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(get_network()), get_runtime())
+ }
+}