aboutsummaryrefslogtreecommitdiff
path: root/derive/src/network
diff options
context:
space:
mode:
Diffstat (limited to 'derive/src/network')
-rw-r--r--derive/src/network/list.rs63
-rw-r--r--derive/src/network/map.rs6
-rw-r--r--derive/src/network/maplist.rs6
-rw-r--r--derive/src/network/mod.rs17
4 files changed, 18 insertions, 74 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)
}
}
};