diff options
Diffstat (limited to '')
| -rw-r--r-- | src/primitive/message.rs | 10 | ||||
| -rw-r--r-- | src/primitive/variant.rs | 32 | ||||
| -rw-r--r-- | src/primitive/variantlist.rs | 30 |
3 files changed, 37 insertions, 35 deletions
diff --git a/src/primitive/message.rs b/src/primitive/message.rs index ff992e3..12edb29 100644 --- a/src/primitive/message.rs +++ b/src/primitive/message.rs @@ -6,7 +6,7 @@ use crate::{deserialize::*, serialize::*}; use crate::primitive::BufferInfo; -use super::Variant; +use super::{Variant, VariantList}; /// The Message struct represents a Message as received in IRC /// @@ -222,13 +222,11 @@ bitflags! { } } -impl<T> crate::message::Network for HashMap<T, MessageType> +impl<T> crate::message::NetworkList for HashMap<T, MessageType> where T: std::convert::TryFrom<Variant> + Into<Variant> + Clone + std::hash::Hash + std::cmp::Eq, { - type Item = super::VariantList; - - fn to_network(&self) -> Self::Item { + fn to_network_list(&self) -> VariantList { let mut res = Vec::with_capacity(self.len() * 2); self.iter().for_each(|(k, v)| { @@ -239,7 +237,7 @@ where return res; } - fn from_network(input: &mut Self::Item) -> Self { + fn from_network_list(input: &mut VariantList) -> Self { use itertools::Itertools; let mut res = HashMap::with_capacity(input.len() / 2); diff --git a/src/primitive/variant.rs b/src/primitive/variant.rs index 673d39f..b306ea7 100644 --- a/src/primitive/variant.rs +++ b/src/primitive/variant.rs @@ -86,38 +86,12 @@ impl From<&str> for Variant { /// Implements the Network trait genericly for everything that /// can be a VariantList / Vec<T> -impl<T> crate::message::Network for Vec<T> -where - T: std::convert::TryFrom<Variant> + Into<Variant> + Clone, -{ - type Item = super::VariantList; - - fn to_network(&self) -> Self::Item { - self.iter().map(|i| (*i).clone().into()).collect() - } - - fn from_network(input: &mut Self::Item) -> Self { - input - .iter() - .map(|i| match T::try_from(i.clone()) { - Ok(it) => it, - // TODO handle error - _ => unreachable!(), - }) - .collect() - } -} - -/// Implements the Network trait genericly for everything that -/// can be a VariantList / Vec<T> -impl<T, S> crate::message::Network for HashMap<T, S> +impl<T, S> crate::message::NetworkList for HashMap<T, S> where T: std::convert::TryFrom<Variant> + Into<Variant> + Clone + std::hash::Hash + std::cmp::Eq, S: std::convert::TryFrom<Variant> + Into<Variant> + Clone + std::hash::Hash + std::cmp::Eq, { - type Item = super::VariantList; - - fn to_network(&self) -> Self::Item { + fn to_network_list(&self) -> VariantList { let mut res = Vec::with_capacity(self.len() * 2); self.iter().for_each(|(k, v)| { @@ -128,7 +102,7 @@ where return res; } - fn from_network(input: &mut Self::Item) -> Self { + fn from_network_list(input: &mut VariantList) -> Self { let mut res = HashMap::with_capacity(input.len() / 2); input.iter().tuples().for_each(|(k, v)| { diff --git a/src/primitive/variantlist.rs b/src/primitive/variantlist.rs index b3ca720..d3518e6 100644 --- a/src/primitive/variantlist.rs +++ b/src/primitive/variantlist.rs @@ -45,3 +45,33 @@ impl Deserialize for VariantList { return Ok((pos, res)); } } + +impl<S> crate::message::NetworkMap for Vec<S> +where + S: std::convert::TryFrom<Variant> + Into<Variant> + Clone + std::hash::Hash + std::cmp::Eq, + <S as TryFrom<Variant>>::Error: std::fmt::Debug, +{ + type Item = VariantList; + + fn to_network_map(&self) -> VariantList { + self.iter().map(|i| i.clone().into()).collect() + } + + fn from_network_map(input: &mut VariantList) -> Self { + input.iter().map(|i| i.clone().try_into().unwrap()).collect() + } +} + +impl<S> crate::message::NetworkList for Vec<S> +where + S: std::convert::TryFrom<Variant> + Into<Variant> + Clone + std::hash::Hash + std::cmp::Eq, + <S as TryFrom<Variant>>::Error: std::fmt::Debug, +{ + fn to_network_list(&self) -> VariantList { + self.iter().map(|i| i.clone().into()).collect() + } + + fn from_network_list(input: &mut VariantList) -> Self { + input.iter().map(|i| i.clone().try_into().unwrap()).collect() + } +} |
