diff options
Diffstat (limited to '')
| -rw-r--r-- | derive/src/network/list.rs | 63 | ||||
| -rw-r--r-- | derive/src/network/map.rs | 6 | ||||
| -rw-r--r-- | derive/src/network/maplist.rs | 6 | ||||
| -rw-r--r-- | derive/src/network/mod.rs | 17 | ||||
| -rw-r--r-- | src/message/signalproxy/initdata.rs | 2 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/aliasmanager.rs | 2 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/buffersyncer.rs | 2 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/bufferviewmanager.rs | 6 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/highlightrulemanager.rs | 8 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/mod.rs | 2 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/network.rs | 12 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/networkinfo.rs | 4 | ||||
| -rw-r--r-- | src/message/signalproxy/translation.rs | 32 | ||||
| -rw-r--r-- | src/primitive/bufferid.rs | 4 | ||||
| -rw-r--r-- | src/primitive/message.rs | 4 | ||||
| -rw-r--r-- | src/primitive/variant.rs | 7 |
16 files changed, 77 insertions, 100 deletions
diff --git a/derive/src/network/list.rs b/derive/src/network/list.rs index d1035c4..4da958c 100644 --- a/derive/src/network/list.rs +++ b/derive/src/network/list.rs @@ -36,66 +36,3 @@ pub(crate) fn to(fields: &[NetworkField]) -> Vec<TokenStream> { }) .collect() } - -pub(crate) fn from(fields: &[NetworkField]) -> Vec<TokenStream> { - fields - .iter() - .map(|field| { - let field_name = field.ident.as_ref().unwrap(); - - let field_rename = match &field.rename { - Some(name) => name.clone(), - None => format!("{}", field.ident.as_ref().unwrap()), - }; - - let field_variant_type = get_field_variant_type(field); - - let extract_inner = if field.default { - quote! { - let mut i = input.iter(); - match i.position(|x| *x == libquassel::primitive::Variant::ByteArray(String::from(#field_rename))) { - Some(_) => { - match i.next().ok_or_else(|| crate::ProtocolError::MissingField(#field_rename.to_string()))? { - libquassel::primitive::Variant::#field_variant_type(var) => var - .clone() - .try_into() - .unwrap_or(Default::default()), - _ => Default::default(), - } - } - None => Default::default(), - } - } - } else { - quote! { - let mut i = input.iter(); - i.position(|x| *x == libquassel::primitive::Variant::ByteArray(String::from(#field_rename))) - .expect(format!("failed to get field {}", #field_rename).as_str()); - - match i.next().expect("failed to get next field") { - libquassel::primitive::Variant::#field_variant_type(var) => var.clone().try_into().unwrap(), - _ => panic!("network::list::from: wrong variant type"), - } - } - }; - - match field.network { - super::NetworkRepr::List => quote! { - #field_name: libquassel::message::NetworkList::from_network_list(&mut { - #extract_inner - })?, - }, - super::NetworkRepr::Map => quote! { - #field_name: libquassel::message::NetworkMap::from_network_map(&mut { - #extract_inner - })?, - }, - super::NetworkRepr::None => quote! { - #field_name: { - #extract_inner - }, - }, - } - }) - .collect() -} diff --git a/derive/src/network/map.rs b/derive/src/network/map.rs index 39d1cd8..862b8fb 100644 --- a/derive/src/network/map.rs +++ b/derive/src/network/map.rs @@ -59,14 +59,14 @@ pub(crate) fn from(fields: &[NetworkField]) -> Vec<TokenStream> { match field.network { super::NetworkRepr::List => quote! { #field_name: libquassel::message::NetworkList::from_network_list( - &mut std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).#unwrap)?, + std::convert::TryInto::try_into(input.remove(#field_rename).#unwrap).#unwrap)?, }, super::NetworkRepr::Map => quote! { #field_name: libquassel::message::NetworkMap::from_network_map( - &mut std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).#unwrap)?, + &mut std::convert::TryInto::try_into(input.remove(#field_rename).#unwrap).#unwrap)?, }, super::NetworkRepr::None => quote! { - #field_name: std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).#unwrap, + #field_name: std::convert::TryInto::try_into(input.remove(#field_rename).#unwrap).#unwrap, }, } }) diff --git a/derive/src/network/maplist.rs b/derive/src/network/maplist.rs index bf86c75..c471378 100644 --- a/derive/src/network/maplist.rs +++ b/derive/src/network/maplist.rs @@ -150,7 +150,7 @@ pub(crate) fn from(fields: &[NetworkField]) -> Vec<TokenStream> { let field_inner = match field.network { super::NetworkRepr::List => quote! { - libquassel::message::NetworkList::from_network_list(&mut std::convert::TryInto::try_into(input.remove(0)).#unwrap)? + libquassel::message::NetworkList::from_network_list(std::convert::TryInto::try_into(input.remove(0)).#unwrap)? }, super::NetworkRepr::Map => quote! { libquassel::message::NetworkMap::from_network_map(&mut std::convert::TryInto::try_into(input.remove(0)).#unwrap)? @@ -162,14 +162,14 @@ pub(crate) fn from(fields: &[NetworkField]) -> Vec<TokenStream> { if field.stringlist { quote! { - #field_name: match input.get_mut(#field_rename).unwrap() { + #field_name: match input.get_mut(#field_rename).#unwrap { libquassel::primitive::Variant::StringList(input) => #field_inner, _ => panic!("#field_name: wrong variant") }, } } else { quote! { - #field_name: match input.get_mut(#field_rename).unwrap() { + #field_name: match input.get_mut(#field_rename).#unwrap { libquassel::primitive::Variant::VariantList(input) => #field_inner, _ => panic!("#field_name: wrong variant") }, diff --git a/derive/src/network/mod.rs b/derive/src/network/mod.rs index a4f6c72..2a0b8b0 100644 --- a/derive/src/network/mod.rs +++ b/derive/src/network/mod.rs @@ -186,7 +186,6 @@ pub fn network_list(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let name_str = name.to_string(); let to_network_list = list::to(&fields); - let from_network_list = list::from(&fields); let gen = quote! { impl libquassel::message::signalproxy::NetworkList for #name { @@ -198,11 +197,19 @@ pub fn network_list(input: proc_macro::TokenStream) -> proc_macro::TokenStream { Ok(res) } - fn from_network_list(input: &mut libquassel::primitive::VariantList) -> crate::Result<Self> { + fn from_network_list(input: libquassel::primitive::VariantList) -> crate::Result<Self> { + use crate::message::signalproxy::translation::NetworkMap; log::trace!("converting {} from network object: {:#?}", #name_str, input); - Ok(Self { - #(#from_network_list)* - }) + let mut i = input.into_iter(); + let mut map = libquassel::primitive::VariantMap::new(); + + while let Some(key) = i.next() { + let key: String = key.try_into()?; + let value = i.next().ok_or(crate::ProtocolError::MissingField(key.clone()))?; + map.insert(key, value); + } + + Self::from_network_map(&mut map) } } }; diff --git a/src/message/signalproxy/initdata.rs b/src/message/signalproxy/initdata.rs index b69572a..1a31af7 100644 --- a/src/message/signalproxy/initdata.rs +++ b/src/message/signalproxy/initdata.rs @@ -40,7 +40,7 @@ impl Deserialize for InitData { Self { class_name: class_name.clone(), object_name: object_name.clone(), - init_data: Types::from_network(class_name.as_str(), object_name.as_str(), &mut res)?, + init_data: Types::from_network(class_name.as_str(), object_name.as_str(), res)?, }, )) } diff --git a/src/message/signalproxy/objects/aliasmanager.rs b/src/message/signalproxy/objects/aliasmanager.rs index 7bd3ea3..ae6e734 100644 --- a/src/message/signalproxy/objects/aliasmanager.rs +++ b/src/message/signalproxy/objects/aliasmanager.rs @@ -133,7 +133,7 @@ mod tests { #[test] fn aliasmanager_from_network() { assert_eq!( - AliasManager::from_network_list(&mut get_dest()).unwrap(), + AliasManager::from_network_list(get_dest()).unwrap(), get_src() ) } diff --git a/src/message/signalproxy/objects/buffersyncer.rs b/src/message/signalproxy/objects/buffersyncer.rs index 4fd0318..2ca2155 100644 --- a/src/message/signalproxy/objects/buffersyncer.rs +++ b/src/message/signalproxy/objects/buffersyncer.rs @@ -312,7 +312,7 @@ mod tests { #[test] fn buffersyncer_from_network() { assert_eq!( - BufferSyncer::from_network_list(&mut get_network()).unwrap(), + BufferSyncer::from_network_list(get_network()).unwrap(), get_runtime() ) } diff --git a/src/message/signalproxy/objects/bufferviewmanager.rs b/src/message/signalproxy/objects/bufferviewmanager.rs index 5942375..25401ba 100644 --- a/src/message/signalproxy/objects/bufferviewmanager.rs +++ b/src/message/signalproxy/objects/bufferviewmanager.rs @@ -144,9 +144,9 @@ impl super::NetworkList for BufferViewManager { ]) } - fn from_network_list(input: &mut VariantList) -> Result<Self> { - let mut i = input.iter(); - i.position(|x| *x == Variant::ByteArray(String::from("BufferViewIds"))) + fn from_network_list(input: VariantList) -> Result<Self> { + let mut i = input.into_iter(); + i.position(|x| x == Variant::ByteArray(String::from("BufferViewIds"))) .expect("failed to get field BufferViewIds"); let ids = match i.next().expect("failed to get next field") { diff --git a/src/message/signalproxy/objects/highlightrulemanager.rs b/src/message/signalproxy/objects/highlightrulemanager.rs index 948f08a..c694a4c 100644 --- a/src/message/signalproxy/objects/highlightrulemanager.rs +++ b/src/message/signalproxy/objects/highlightrulemanager.rs @@ -277,14 +277,14 @@ mod tests { vec![ Variant::ByteArray(s!("HighlightRuleList")), Variant::VariantMap(map! { - s!("id") => Variant::VariantList(vec![Variant::i32(1)]), - s!("name") => Variant::StringList(vec![s!("testrule")]), - s!("isRegEx") => Variant::VariantList(vec![Variant::bool(false)]), s!("isCaseSensitive") => Variant::VariantList(vec![Variant::bool(false)]), s!("isEnabled") => Variant::VariantList(vec![Variant::bool(true)]), s!("isInverse") => Variant::VariantList(vec![Variant::bool(false)]), + s!("id") => Variant::VariantList(vec![Variant::i32(1)]), s!("sender") => Variant::StringList(vec![s!("testuser")]), s!("channel") => Variant::StringList(vec![s!("#test")]), + s!("name") => Variant::StringList(vec![s!("testrule")]), + s!("isRegEx") => Variant::VariantList(vec![Variant::bool(false)]), }), Variant::ByteArray(s!("highlightNick")), Variant::i32(1), @@ -318,7 +318,7 @@ mod tests { #[test] fn highlightrulemanager_from_network() { assert_eq!( - HighlightRuleManager::from_network_list(&mut get_network()).unwrap(), + HighlightRuleManager::from_network_list(get_network()).unwrap(), get_runtime() ) } diff --git a/src/message/signalproxy/objects/mod.rs b/src/message/signalproxy/objects/mod.rs index a196add..b478989 100644 --- a/src/message/signalproxy/objects/mod.rs +++ b/src/message/signalproxy/objects/mod.rs @@ -98,7 +98,7 @@ impl Types { }) } - pub fn from_network(class_name: &str, object_name: &str, input: &mut VariantList) -> Result<Self> { + pub fn from_network(class_name: &str, object_name: &str, mut input: VariantList) -> Result<Self> { debug!("converting {} from network object: {:#?}", class_name, input); Ok(match class_name { "AliasManager" => Types::AliasManager(Box::new(AliasManager::from_network_list(input)?)), diff --git a/src/message/signalproxy/objects/network.rs b/src/message/signalproxy/objects/network.rs index 996dd80..6638996 100644 --- a/src/message/signalproxy/objects/network.rs +++ b/src/message/signalproxy/objects/network.rs @@ -54,6 +54,7 @@ impl Network { /// The `channel_modes` field is populated by the ``supports["CHANMODES"]` string, /// which is represented as the channel mode types a,b,c,d in a comma sepperated string. + #[allow(dead_code)] fn determine_channel_mode_types(&mut self) { let mut modes: Vec<&str> = self.supports.get("CHANMODES").unwrap().split(',').collect(); @@ -67,6 +68,7 @@ impl Network { .insert(ChannelModeType::AChanmode, modes.pop().unwrap().to_owned()); } + #[allow(dead_code)] fn determine_prefixes(&mut self) { let default_prefixes = vec!['~', '&', '@', '%', '+']; let default_prefix_modes = vec!['q', 'a', 'o', 'h', 'v']; @@ -369,14 +371,14 @@ impl crate::message::signalproxy::NetworkList for Network { } // TODO VariantList -> VariantMap conversion - fn from_network_list(input: &mut VariantList) -> Result<Self> { + fn from_network_list(input: VariantList) -> Result<Self> { let mut i = input.into_iter(); let mut map: VariantMap = VariantMap::new(); while let Some(key) = i.next() { - let key: String = key.clone().try_into()?; + let key: String = key.try_into()?; let value = i.next().ok_or(ProtocolError::MissingField(key.clone()))?; - map.insert(key, value.clone()); + map.insert(key, value); } Self::from_network_map(&mut map) @@ -552,8 +554,8 @@ impl NetworkList for Vec<NetworkServer> { Ok(self.iter().map(|b| Variant::NetworkServer(b.clone())).collect()) } - fn from_network_list(input: &mut super::VariantList) -> Result<Self> { - Ok(input.iter().map(|b| b.try_into().unwrap()).collect()) + fn from_network_list(input: super::VariantList) -> Result<Self> { + Ok(input.into_iter().map(|b| b.try_into().unwrap()).collect()) } } diff --git a/src/message/signalproxy/objects/networkinfo.rs b/src/message/signalproxy/objects/networkinfo.rs index 1a41f84..fe98eda 100644 --- a/src/message/signalproxy/objects/networkinfo.rs +++ b/src/message/signalproxy/objects/networkinfo.rs @@ -212,7 +212,7 @@ mod tests { #[test] fn networkinfo_from_network() { assert_eq!( - NetworkInfo::from_network_list(&mut get_network()).unwrap(), + NetworkInfo::from_network_list(get_network()).unwrap(), get_runtime() ); @@ -221,7 +221,7 @@ mod tests { network.remove(20); network.remove(20); - let left = NetworkInfo::from_network_list(&mut network).unwrap(); + let left = NetworkInfo::from_network_list(network).unwrap(); assert_eq!(left.network_id, NetworkId(0)); } } diff --git a/src/message/signalproxy/translation.rs b/src/message/signalproxy/translation.rs index 40ebac1..b765133 100644 --- a/src/message/signalproxy/translation.rs +++ b/src/message/signalproxy/translation.rs @@ -122,7 +122,37 @@ where pub trait NetworkList { fn to_network_list(&self) -> Result<VariantList>; - fn from_network_list(input: &mut VariantList) -> Result<Self> + fn from_network_list(input: VariantList) -> Result<Self> where Self: std::marker::Sized; } + +// impl<T: NetworkMap<Item = VariantMap>> NetworkList for T { +// fn from_network_list(input: VariantList) -> Result<Self> +// where +// Self: std::marker::Sized + NetworkMap<Item = VariantMap>, +// { +// let mut i = input.into_iter(); +// let mut map: VariantMap = VariantMap::new(); +// +// while let Some(key) = i.next() { +// let key: String = key.try_into()?; +// let value = i.next().ok_or(ProtocolError::MissingField(key.clone()))?; +// map.insert(key, value); +// } +// +// Self::from_network_map(&mut map) +// } +// +// fn to_network_list(&self) -> Result<VariantList> { +// let map = Self::to_network_map(self)?; +// +// let mut list = VariantList::new(); +// for (k, v) in map { +// list.push(Variant::ByteArray(k)); +// list.push(v); +// } +// +// Ok(list) +// } +// } diff --git a/src/primitive/bufferid.rs b/src/primitive/bufferid.rs index 88b56fa..8d76f5b 100644 --- a/src/primitive/bufferid.rs +++ b/src/primitive/bufferid.rs @@ -52,8 +52,8 @@ impl NetworkList for Vec<BufferId> { Ok(self.iter().map(|b| Variant::BufferId(*b)).collect()) } - fn from_network_list(input: &mut super::VariantList) -> Result<Self, ProtocolError> { - input.iter().map(|b| b.try_into()).collect() + fn from_network_list(input: super::VariantList) -> Result<Self, ProtocolError> { + input.into_iter().map(|b| b.try_into()).collect() } } diff --git a/src/primitive/message.rs b/src/primitive/message.rs index 819ddd1..5455908 100644 --- a/src/primitive/message.rs +++ b/src/primitive/message.rs @@ -206,12 +206,12 @@ where Ok(res) } - fn from_network_list(input: &mut VariantList) -> Result<Self, ProtocolError> { + fn from_network_list(input: VariantList) -> Result<Self, ProtocolError> { use itertools::Itertools; let mut res = HashMap::with_capacity(input.len() / 2); - input.iter().tuples().for_each(|(k, v)| { + input.into_iter().tuples().for_each(|(k, v)| { res.insert( match T::try_from(k.clone()) { Ok(it) => it, diff --git a/src/primitive/variant.rs b/src/primitive/variant.rs index a7db7c3..e332bf2 100644 --- a/src/primitive/variant.rs +++ b/src/primitive/variant.rs @@ -22,8 +22,9 @@ use libquassel_derive::From; /// /// ByteArray is de-/serialized as a C ByteArray. #[allow(non_camel_case_types, dead_code)] -#[derive(Clone, Debug, PartialEq, From)] +#[derive(Clone, Default, Debug, PartialEq, From)] pub enum Variant { + #[default] Unknown, #[from(ignore)] UserType(String, Vec<u8>), @@ -103,10 +104,10 @@ where Ok(res) } - fn from_network_list(input: &mut VariantList) -> Result<Self> { + fn from_network_list(input: VariantList) -> Result<Self> { let mut res = HashMap::with_capacity(input.len() / 2); - input.iter().tuples().for_each(|(k, v)| { + input.into_iter().tuples().for_each(|(k, v)| { res.insert( match T::try_from(k.clone()) { Ok(it) => it, |
