diff options
Diffstat (limited to '')
| -rw-r--r-- | derive/src/network/list.rs | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/derive/src/network/list.rs b/derive/src/network/list.rs index 8b1556e..79f9739 100644 --- a/derive/src/network/list.rs +++ b/derive/src/network/list.rs @@ -16,14 +16,21 @@ pub(crate) fn to(fields: &Vec<NetworkField>) -> Vec<TokenStream> { let field_type = get_field_variant_type(&field); let field_inner = if field.network { - quote! { self.#field_name.to_network() } + if field.map { + quote! { self.#field_name.to_network_map() } + } else { + match field.variant.as_ref().map_or("", |m| m.as_str()) { + "VariantMap" => quote! { self.#field_name.to_network_map() }, + &_ => quote! { self.#field_name.to_network() }, + } + } } else { quote! { self.#field_name.clone() } }; quote! { - res.push(crate::primitive::Variant::ByteArray(#field_rename.to_string())); - res.push(crate::primitive::Variant::#field_type(#field_inner)); + res.push(libquassel::primitive::Variant::ByteArray(#field_rename.to_string())); + res.push(libquassel::primitive::Variant::#field_type(#field_inner)); } }) .collect() @@ -47,20 +54,35 @@ pub(crate) fn from(fields: &Vec<NetworkField>) -> Vec<TokenStream> { let extract_inner = quote! { let mut i = input.iter(); - i.position(|x| *x == crate::primitive::Variant::ByteArray(String::from(#field_rename))) + 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") { - crate::primitive::Variant::#field_variant_type(var) => var.clone(), + libquassel::primitive::Variant::#field_variant_type(var) => var.clone(), _ => panic!("network::list::from: wrong variant type"), } }; if field.network { - quote! { - #field_name: #field_type_colon::from_network(&mut { - #extract_inner - }), + if field.map { + quote! { + #field_name: #field_type_colon::from_network_map(&mut { + #extract_inner + }), + } + } else { + match field.variant.as_ref().map_or("", |m| m.as_str()) { + "VariantMap" => quote! { + #field_name: #field_type_colon::from_network_map(&mut { + #extract_inner + }), + }, + &_ => quote! { + #field_name: #field_type_colon::from_network(&mut { + #extract_inner + }), + }, + } } } else { quote! { |
