diff options
Diffstat (limited to 'derive')
| -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 |
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) } } }; |
