aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMax Audron <audron@cocaine.farm>2021-03-09 17:18:22 +0100
committerMax Audron <audron@cocaine.farm>2021-03-09 17:18:22 +0100
commit57e0309994be634f3935cf981d4b1ce60b481aba (patch)
treeb6a5f9cfc28e6aa7ce4e6b9bbc41faa76003984e /src
parentadd to and from network derive (diff)
WIP: impl signalproxy types
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs1
-rw-r--r--src/message/signalproxy/objects/aliasmanager.rs89
-rw-r--r--src/message/signalproxy/objects/ircchannel.rs4
-rw-r--r--src/message/signalproxy/objects/ircuser.rs26
-rw-r--r--src/message/signalproxy/objects/mod.rs11
-rw-r--r--src/message/signalproxy/objects/network.rs396
-rw-r--r--src/message/signalproxy/objects/networkinfo.rs7
-rw-r--r--src/message/signalproxy/translation/mod.rs2
-rw-r--r--src/primitive/bufferinfo.rs1
-rw-r--r--src/primitive/string.rs2
-rw-r--r--src/primitive/variant.rs6
11 files changed, 298 insertions, 247 deletions
diff --git a/src/lib.rs b/src/lib.rs
index f96e7a7..a2a3a25 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,4 +1,3 @@
-#![feature(array_value_iter)]
#![feature(external_doc)]
#![feature(doc_cfg)]
#![doc(include = "../README.md")]
diff --git a/src/message/signalproxy/objects/aliasmanager.rs b/src/message/signalproxy/objects/aliasmanager.rs
index b816778..093163b 100644
--- a/src/message/signalproxy/objects/aliasmanager.rs
+++ b/src/message/signalproxy/objects/aliasmanager.rs
@@ -1,4 +1,4 @@
-use crate::primitive::{StringList, Variant, VariantList, VariantMap};
+use crate::primitive::{StringList, Variant, VariantMap};
use crate::message::signalproxy::Network;
@@ -13,14 +13,45 @@ pub struct Alias {
expansion: String,
}
-impl Network for AliasManager {
- type Item = VariantList;
+impl Alias {
+ fn from_network_internal(input: &VariantMap) -> Vec<Self> {
+ let names = match_variant!(input.get("names").unwrap(), Variant::StringList);
+ let expansions = match_variant!(input.get("expansions").unwrap(), Variant::StringList);
+
+ return names
+ .iter()
+ .zip(expansions)
+ .map(|(name, expansion)| Alias {
+ name: name.clone(),
+ expansion,
+ })
+ .collect();
+ }
+}
+
+impl Network for Alias {
+ type Item = VariantMap;
+
+ fn to_network(&self) -> Self::Item {
+ let mut map = VariantMap::new();
+ map.insert(s!("names"), Variant::StringList(vec![self.name.clone()]));
+ map.insert(
+ s!("expansions"),
+ Variant::StringList(vec![self.expansion.clone()]),
+ );
- fn to_network(&self) -> VariantList {
- let mut res = VariantList::new();
+ return map;
+ }
- res.push(Variant::ByteArray(s!("Aliases")));
+ fn from_network(input: &mut Self::Item) -> Self {
+ Alias::from_network_internal(&input)[0].clone()
+ }
+}
+impl Network for AliasManager {
+ type Item = VariantMap;
+
+ fn to_network(&self) -> Self::Item {
let (names, expansions) = self.aliases.iter().fold(
(StringList::new(), StringList::new()),
|(mut names, mut expansions), alias| {
@@ -34,17 +65,10 @@ impl Network for AliasManager {
map.insert(s!("names"), Variant::StringList(names));
map.insert(s!("expansions"), Variant::StringList(expansions));
- res.push(Variant::VariantMap(map));
-
- return res;
+ return map;
}
- fn from_network(input: crate::primitive::VariantList) -> Self {
- let input = match &input[1] {
- Variant::VariantMap(input) => input,
- _ => unimplemented!(),
- };
-
+ fn from_network(input: &mut Self::Item) -> Self {
let names = match_variant!(input.get("names").unwrap(), Variant::StringList);
let expansions = match_variant!(input.get("expansions").unwrap(), Variant::StringList);
@@ -80,24 +104,21 @@ mod tests {
}
}
- fn get_dest() -> VariantList {
- vec![
- Variant::ByteArray(s!("Aliases")),
- Variant::VariantMap(map! {
- s!("names") => Variant::StringList(
- vec![
- s!("j"),
- s!("ns"),
- ],
- ),
- s!("expansions") => Variant::StringList(
- vec![
- s!("/join $0"),
- s!("/msg nickserv $0"),
- ],
- ),
- }),
- ]
+ fn get_dest() -> VariantMap {
+ map! {
+ s!("names") => Variant::StringList(
+ vec![
+ s!("j"),
+ s!("ns"),
+ ],
+ ),
+ s!("expansions") => Variant::StringList(
+ vec![
+ s!("/join $0"),
+ s!("/msg nickserv $0"),
+ ],
+ ),
+ }
}
#[test]
@@ -107,7 +128,7 @@ mod tests {
#[test]
fn aliasmanager_from_network() {
- assert_eq!(AliasManager::from_network(get_dest()), get_src())
+ assert_eq!(AliasManager::from_network(&mut get_dest()), get_src())
}
}
diff --git a/src/message/signalproxy/objects/ircchannel.rs b/src/message/signalproxy/objects/ircchannel.rs
index cd5cd3e..b15d789 100644
--- a/src/message/signalproxy/objects/ircchannel.rs
+++ b/src/message/signalproxy/objects/ircchannel.rs
@@ -91,7 +91,7 @@ impl Network for IrcChannel {
res
}
- fn from_network(input: Self::Item) -> Self {
+ fn from_network(input: &mut Self::Item) -> Self {
Self {
channel_modes_a: match_variant!(
match_variant!(
@@ -284,6 +284,6 @@ mod tests {
#[test]
fn ircchannel_from_network() {
- assert_eq!(IrcChannel::from_network(get_network()), get_runtime())
+ assert_eq!(IrcChannel::from_network(&mut get_network()), get_runtime())
}
}
diff --git a/src/message/signalproxy/objects/ircuser.rs b/src/message/signalproxy/objects/ircuser.rs
index 0ce597f..1064965 100644
--- a/src/message/signalproxy/objects/ircuser.rs
+++ b/src/message/signalproxy/objects/ircuser.rs
@@ -1,9 +1,26 @@
-use crate::primitive::{DateTime, StringList};
+use std::collections::HashMap;
+
+use crate::primitive::{DateTime, StringList, Variant, VariantMap};
#[allow(unused_imports)]
use crate::message::signalproxy::Network;
use libquassel_derive::Network;
+impl Network for Vec<IrcUser> {
+ type Item = VariantMap;
+
+ fn to_network(&self) -> Self::Item {
+ Variant::VariantMap(self.iter().fold(HashMap::new(), |mut res, v| {
+ res.extend(v.to_network());
+
+ res
+ }))
+ }
+ fn from_network(input: &mut Self::Item) -> Self {
+ todo!()
+ }
+}
+
#[allow(dead_code)]
#[derive(Debug, Clone, PartialEq, Network)]
#[network(repr = "maplist")]
@@ -196,6 +213,11 @@ mod tests {
#[test]
fn ircuser_from_network() {
- assert_eq!(IrcUser::from_network(get_network()), get_runtime())
+ assert_eq!(IrcUser::from_network(&mut get_network()), get_runtime())
+ }
+
+ #[test]
+ fn vec_ircuser_to_network() {
+ assert_eq!(get_runtime().to_network(), get_network())
}
}
diff --git a/src/message/signalproxy/objects/mod.rs b/src/message/signalproxy/objects/mod.rs
index a313312..84f2f5a 100644
--- a/src/message/signalproxy/objects/mod.rs
+++ b/src/message/signalproxy/objects/mod.rs
@@ -1,13 +1,10 @@
-// mod aliasmanager;
-// mod backlogmanager;
-
mod aliasmanager;
mod buffersyncer;
mod identity;
-mod ircchannel;
-mod ircuser;
-mod network;
-mod networkinfo;
+// mod ircchannel;
+// mod ircuser;
+// mod network;
+// mod networkinfo;
pub use aliasmanager::*;
pub use buffersyncer::*;
diff --git a/src/message/signalproxy/objects/network.rs b/src/message/signalproxy/objects/network.rs
index cb1edd2..4075499 100644
--- a/src/message/signalproxy/objects/network.rs
+++ b/src/message/signalproxy/objects/network.rs
@@ -28,221 +28,221 @@ pub struct Network {
network_info: NetworkInfo,
}
-// impl crate::message::signalproxy::Network for Network {
-// type Item = VariantList;
+impl crate::message::signalproxy::Network for Network {
+ type Item = VariantList;
-// fn to_network(&self) -> Self::Item {
-// let mut res = Self::Item::new();
+ fn to_network(&self) -> Self::Item {
+ let mut res = Self::Item::new();
-// res.push(Variant::ByteArray(s!("myNick")));
-// res.push(Variant::String(self.my_nick.clone()));
-// res.push(Variant::ByteArray(s!("latency")));
-// res.push(Variant::i32(self.latency));
-// res.push(Variant::ByteArray(s!("currentServer")));
-// res.push(Variant::String(self.current_server.clone()));
-// res.push(Variant::ByteArray(s!("isConnected")));
-// res.push(Variant::bool(self.is_connected));
-// res.push(Variant::ByteArray(s!("connectionState")));
-// res.push(Variant::i32(self.connection_state.clone() as i32));
+ res.push(Variant::ByteArray(s!("myNick")));
+ res.push(Variant::String(self.my_nick.clone()));
+ res.push(Variant::ByteArray(s!("latency")));
+ res.push(Variant::i32(self.latency));
+ res.push(Variant::ByteArray(s!("currentServer")));
+ res.push(Variant::String(self.current_server.clone()));
+ res.push(Variant::ByteArray(s!("isConnected")));
+ res.push(Variant::bool(self.is_connected));
+ res.push(Variant::ByteArray(s!("connectionState")));
+ res.push(Variant::i32(self.connection_state.clone() as i32));
-// res.push(Variant::ByteArray(s!("Supports")));
-// res.push(Variant::VariantMap(
-// self.supports
-// .iter()
-// .map(|(k, v)| (k.clone(), Variant::String(v.clone())))
-// .collect(),
-// ));
+ res.push(Variant::ByteArray(s!("Supports")));
+ res.push(Variant::VariantMap(
+ self.supports
+ .iter()
+ .map(|(k, v)| (k.clone(), Variant::String(v.clone())))
+ .collect(),
+ ));
-// res.push(Variant::ByteArray(s!("Caps")));
-// res.push(Variant::VariantMap(
-// self.caps
-// .iter()
-// .map(|(k, v)| (k.clone(), Variant::String(v.clone())))
-// .collect(),
-// ));
+ res.push(Variant::ByteArray(s!("Caps")));
+ res.push(Variant::VariantMap(
+ self.caps
+ .iter()
+ .map(|(k, v)| (k.clone(), Variant::String(v.clone())))
+ .collect(),
+ ));
-// res.push(Variant::ByteArray(s!("CapsEnabled")));
-// res.push(Variant::VariantList(
-// self.caps_enabled
-// .iter()
-// .map(|v| Variant::String(v.clone()))
-// .collect(),
-// ));
+ res.push(Variant::ByteArray(s!("CapsEnabled")));
+ res.push(Variant::VariantList(
+ self.caps_enabled
+ .iter()
+ .map(|v| Variant::String(v.clone()))
+ .collect(),
+ ));
-// {
-// let mut map = VariantMap::new();
+ {
+ let mut map = VariantMap::new();
-// map.insert(
-// s!("Users"),
-// Variant::VariantMap(self.irc_users.iter().fold(
-// HashMap::new(),
-// |mut res, (_, v)| {
-// res.extend(v.to_network());
+ map.insert(
+ s!("Users"),
+ Variant::VariantMap(self.irc_users.iter().fold(
+ HashMap::new(),
+ |mut res, (_, v)| {
+ res.extend(v.to_network());
-// res
-// },
-// )),
-// );
+ res
+ },
+ )),
+ );
-// let channels = self
-// .irc_channels
-// .iter()
-// .fold(HashMap::new(), |mut res, (_, v)| {
-// res.extend(v.to_network());
+ let channels = self
+ .irc_channels
+ .iter()
+ .fold(HashMap::new(), |mut res, (_, v)| {
+ res.extend(v.to_network());
-// res
-// });
+ res
+ });
-// map.insert(s!("Channels"), Variant::VariantMap(channels));
+ map.insert(s!("Channels"), Variant::VariantMap(channels));
-// res.push(Variant::ByteArray(s!("IrcUsersAndChannels")));
-// res.push(Variant::VariantMap(map));
-// }
+ res.push(Variant::ByteArray(s!("IrcUsersAndChannels")));
+ res.push(Variant::VariantMap(map));
+ }
-// res.extend(self.network_info.to_network());
+ res.extend(self.network_info.to_network());
-// res
-// }
+ res
+ }
-// fn from_network(input: Self::Item) -> Self {
-// let users_and_channels = match_variant!(
-// input
-// .iter()
-// .nth(
-// input
-// .iter()
-// .position(|x| *x == Variant::ByteArray(s!("IrcUsersAndChannels")))
-// .unwrap()
-// )
-// .unwrap(),
-// Variant::VariantMap
-// );
+ fn from_network(input: &mut Self::Item) -> Self {
+ let users_and_channels = match_variant!(
+ input
+ .iter()
+ .nth(
+ input
+ .iter()
+ .position(|x| *x == Variant::ByteArray(s!("IrcUsersAndChannels")))
+ .unwrap()
+ )
+ .unwrap(),
+ Variant::VariantMap
+ );
-// let res = Self {
-// my_nick: match_variant!(
-// input
-// .iter()
-// .nth(
-// input
-// .iter()
-// .position(|x| *x == Variant::ByteArray(s!("myNick")))
-// .unwrap()
-// )
-// .unwrap(),
-// Variant::String
-// ),
-// latency: match_variant!(
-// input
-// .iter()
-// .nth(
-// input
-// .iter()
-// .position(|x| *x == Variant::ByteArray(s!("latency")))
-// .unwrap()
-// )
-// .unwrap(),
-// Variant::i32
-// ),
-// current_server: match_variant!(
-// input
-// .iter()
-// .nth(
-// input
-// .iter()
-// .position(|x| *x == Variant::ByteArray(s!("currentServer")))
-// .unwrap()
-// )
-// .unwrap(),
-// Variant::String
-// ),
-// is_connected: match_variant!(
-// input
-// .iter()
-// .nth(
-// input
-// .iter()
-// .position(|x| *x == Variant::ByteArray(s!("isConnected")))
-// .unwrap()
-// )
-// .unwrap(),
-// Variant::bool
-// ),
-// connection_state: ConnectionState::from_i32(match_variant!(
-// input
-// .iter()
-// .nth(
-// input
-// .iter()
-// .position(|x| *x == Variant::ByteArray(s!("connectionState")))
-// .unwrap()
-// )
-// .unwrap(),
-// Variant::i32
-// ))
-// .unwrap(),
-// irc_users: match_variant!(
-// users_and_channels.get("Users").unwrap(),
-// Variant::VariantMap
-// )
-// .iter()
-// .map(|(k, v)| (k, IrcUser::from_network(v))),
-// irc_channels: match_variant!(
-// users_and_channels.get("Channels").unwrap(),
-// Variant::VariantMap
-// )
-// .iter()
-// .map(|(k, v)| (k, match_variant!(v, Variant::VariantList))),
-// supports: match_variant!(
-// input
-// .iter()
-// .nth(
-// input
-// .iter()
-// .position(|x| *x == Variant::ByteArray(s!("Supports")))
-// .unwrap()
-// )
-// .unwrap(),
-// Variant::VariantMap
-// )
-// .iter()
-// .map(|(k, v)| (k.clone(), match_variant!(v, Variant::String)))
-// .collect(),
-// caps: match_variant!(
-// input
-// .iter()
-// .nth(
-// input
-// .iter()
-// .position(|x| *x == Variant::ByteArray(s!("Caps")))
-// .unwrap()
-// )
-// .unwrap(),
-// Variant::VariantMap
-// )
-// .iter()
-// .map(|(k, v)| (k.clone(), match_variant!(v, Variant::String)))
-// .collect(),
-// caps_enabled: match_variant!(
-// input
-// .iter()
-// .nth(
-// input
-// .iter()
-// .position(|x| *x == Variant::ByteArray(s!("CapsEnabled")))
-// .unwrap()
-// )
-// .unwrap(),
-// Variant::VariantList
-// )
-// .iter()
-// .map(|v| match_variant!(v, Variant::String))
-// .collect(),
-// network_info: NetworkInfo::from_network(input),
-// };
+ let res = Self {
+ my_nick: match_variant!(
+ input
+ .iter()
+ .nth(
+ input
+ .iter()
+ .position(|x| *x == Variant::ByteArray(s!("myNick")))
+ .unwrap()
+ )
+ .unwrap(),
+ Variant::String
+ ),
+ latency: match_variant!(
+ input
+ .iter()
+ .nth(
+ input
+ .iter()
+ .position(|x| *x == Variant::ByteArray(s!("latency")))
+ .unwrap()
+ )
+ .unwrap(),
+ Variant::i32
+ ),
+ current_server: match_variant!(
+ input
+ .iter()
+ .nth(
+ input
+ .iter()
+ .position(|x| *x == Variant::ByteArray(s!("currentServer")))
+ .unwrap()
+ )
+ .unwrap(),
+ Variant::String
+ ),
+ is_connected: match_variant!(
+ input
+ .iter()
+ .nth(
+ input
+ .iter()
+ .position(|x| *x == Variant::ByteArray(s!("isConnected")))
+ .unwrap()
+ )
+ .unwrap(),
+ Variant::bool
+ ),
+ connection_state: ConnectionState::from_i32(match_variant!(
+ input
+ .iter()
+ .nth(
+ input
+ .iter()
+ .position(|x| *x == Variant::ByteArray(s!("connectionState")))
+ .unwrap()
+ )
+ .unwrap(),
+ Variant::i32
+ ))
+ .unwrap(),
+ irc_users: match_variant!(
+ users_and_channels.get("Users").unwrap(),
+ Variant::VariantMap
+ )
+ .iter()
+ .map(|(k, v)| (k, IrcUser::from_network(v))),
+ irc_channels: match_variant!(
+ users_and_channels.get("Channels").unwrap(),
+ Variant::VariantMap
+ )
+ .iter()
+ .map(|(k, v)| (k, match_variant!(v, Variant::VariantList))),
+ supports: match_variant!(
+ input
+ .iter()
+ .nth(
+ input
+ .iter()
+ .position(|x| *x == Variant::ByteArray(s!("Supports")))
+ .unwrap()
+ )
+ .unwrap(),
+ Variant::VariantMap
+ )
+ .iter()
+ .map(|(k, v)| (k.clone(), match_variant!(v, Variant::String)))
+ .collect(),
+ caps: match_variant!(
+ input
+ .iter()
+ .nth(
+ input
+ .iter()
+ .position(|x| *x == Variant::ByteArray(s!("Caps")))
+ .unwrap()
+ )
+ .unwrap(),
+ Variant::VariantMap
+ )
+ .iter()
+ .map(|(k, v)| (k.clone(), match_variant!(v, Variant::String)))
+ .collect(),
+ caps_enabled: match_variant!(
+ input
+ .iter()
+ .nth(
+ input
+ .iter()
+ .position(|x| *x == Variant::ByteArray(s!("CapsEnabled")))
+ .unwrap()
+ )
+ .unwrap(),
+ Variant::VariantList
+ )
+ .iter()
+ .map(|v| match_variant!(v, Variant::String))
+ .collect(),
+ network_info: NetworkInfo::from_network(input),
+ };
-// todo!()
-// }
-// }
+ todo!()
+ }
+}
#[allow(dead_code)]
#[derive(Debug, Clone, PartialEq, Network)]
diff --git a/src/message/signalproxy/objects/networkinfo.rs b/src/message/signalproxy/objects/networkinfo.rs
index a7f0a3c..e36297d 100644
--- a/src/message/signalproxy/objects/networkinfo.rs
+++ b/src/message/signalproxy/objects/networkinfo.rs
@@ -16,7 +16,7 @@ pub struct NetworkInfo {
rename = "ServerList",
override_type = "VariantList",
to_map = "|server| Variant::VariantMap(server.to_network())",
- from_map = "|server| NetworkServer::from_network(match_variant!(server, Variant::VariantMap))"
+ from_map = "|server| NetworkServer::from_network(&mut match_variant!(server, Variant::VariantMap))"
)]
pub server_list: Vec<NetworkServer>,
#[network(rename = "perform")]
@@ -166,4 +166,9 @@ mod tests {
fn networkinfo_to_network() {
assert_eq!(get_runtime().to_network(), get_network())
}
+
+ #[test]
+ fn networkinfo_from_network() {
+ assert_eq!(NetworkInfo::from_network(&mut get_network()), get_runtime())
+ }
}
diff --git a/src/message/signalproxy/translation/mod.rs b/src/message/signalproxy/translation/mod.rs
index bbb8b3f..064257c 100644
--- a/src/message/signalproxy/translation/mod.rs
+++ b/src/message/signalproxy/translation/mod.rs
@@ -2,5 +2,5 @@ pub trait Network {
type Item;
fn to_network(&self) -> Self::Item;
- fn from_network(input: Self::Item) -> Self;
+ fn from_network(input: &mut Self::Item) -> Self;
}
diff --git a/src/primitive/bufferinfo.rs b/src/primitive/bufferinfo.rs
index 1c4e206..24080cb 100644
--- a/src/primitive/bufferinfo.rs
+++ b/src/primitive/bufferinfo.rs
@@ -42,6 +42,7 @@ impl Deserialize for BufferInfo {
// There are 4 additional undocumented Bytes in the BufferInfo
// so we start at byte 14
+ // TODO is groupid
let (size, name) = String::parse_utf8(&b[14..])?;
return Ok((
diff --git a/src/primitive/string.rs b/src/primitive/string.rs
index 590c529..7ea838d 100644
--- a/src/primitive/string.rs
+++ b/src/primitive/string.rs
@@ -10,6 +10,8 @@ use log::trace;
use crate::util;
use crate::{Deserialize, DeserializeUTF8, Serialize, SerializeUTF8};
+pub type ByteArray = String;
+
/// We Shadow the String type here as we can only use impl on types in our own scope.
///
/// Strings are serialized as an i32 for the length in bytes, then the chars represented in UTF-16 in bytes.
diff --git a/src/primitive/variant.rs b/src/primitive/variant.rs
index e9e032e..8a98d59 100644
--- a/src/primitive/variant.rs
+++ b/src/primitive/variant.rs
@@ -12,6 +12,8 @@ use crate::{Serialize, SerializeUTF8};
use crate::primitive::{BufferInfo, Date, DateTime, Message, Time, VariantList, VariantMap};
+use libquassel_derive::From;
+
/// Variant represents the possible types we can receive
///
/// Variant's are serizalized as the Type as a i32 and then the Type in it's own format
@@ -21,9 +23,10 @@ use crate::primitive::{BufferInfo, Date, DateTime, Message, Time, VariantList, V
///
/// ByteArray is de-/serialized as a C ByteArray.
#[allow(non_camel_case_types, dead_code)]
-#[derive(Clone, Debug, std::cmp::PartialEq)]
+#[derive(Clone, Debug, PartialEq, From)]
pub enum Variant {
Unknown,
+ #[from(ignore)]
UserType(String, Vec<u8>),
BufferInfo(BufferInfo),
Message(Message),
@@ -33,6 +36,7 @@ pub enum Variant {
VariantMap(VariantMap),
VariantList(VariantList),
String(String),
+ #[from(ignore)]
ByteArray(String),
StringList(StringList),
bool(bool),