diff options
Diffstat (limited to 'derive/src/network/list.rs')
| -rw-r--r-- | derive/src/network/list.rs | 122 |
1 files changed, 66 insertions, 56 deletions
diff --git a/derive/src/network/list.rs b/derive/src/network/list.rs index 79f9739..0c6e626 100644 --- a/derive/src/network/list.rs +++ b/derive/src/network/list.rs @@ -7,30 +7,34 @@ pub(crate) fn to(fields: &Vec<NetworkField>) -> Vec<TokenStream> { fields .iter() .map(|field| { - let field_rename = match &field.rename { - Some(name) => name.clone(), - None => format!("{}", field.ident.as_ref().unwrap()).into(), - }; + if !field.skip { + let field_rename = match &field.rename { + Some(name) => name.clone(), + None => format!("{}", field.ident.as_ref().unwrap()).into(), + }; - let field_name = field.ident.as_ref().unwrap(); - let field_type = get_field_variant_type(&field); + let field_name = field.ident.as_ref().unwrap(); + let field_type = get_field_variant_type(&field); - let field_inner = if field.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() }, + let field_inner = if field.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(libquassel::primitive::Variant::ByteArray(#field_rename.to_string())); + res.push(libquassel::primitive::Variant::#field_type(#field_inner)); } } else { - quote! { self.#field_name.clone() } - }; - - quote! { - res.push(libquassel::primitive::Variant::ByteArray(#field_rename.to_string())); - res.push(libquassel::primitive::Variant::#field_type(#field_inner)); + quote! {} } }) .collect() @@ -40,56 +44,62 @@ pub(crate) fn from(fields: &Vec<NetworkField>) -> Vec<TokenStream> { fields .iter() .map(|field| { - let field_rename = match &field.rename { - Some(name) => name.clone(), - None => format!("{}", field.ident.as_ref().unwrap()).into(), - }; - let field_name = field.ident.as_ref().unwrap(); - let field_type = get_field_type(&field); - let field_variant_type = get_field_variant_type(&field); + if field.default { + quote! { + #field_name: Default::default(), + } + } else { + let field_rename = match &field.rename { + Some(name) => name.clone(), + None => format!("{}", field.ident.as_ref().unwrap()).into(), + }; - let field_type_colon = get_field_type_colon(field_type.clone()); + let field_type = get_field_type(&field); + let field_variant_type = get_field_variant_type(&field); - let extract_inner = 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()); + let field_type_colon = get_field_type_colon(field_type.clone()); - match i.next().expect("failed to get next field") { - libquassel::primitive::Variant::#field_variant_type(var) => var.clone(), - _ => panic!("network::list::from: wrong variant type"), - } - }; + let extract_inner = 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()); - if field.network { - if field.map { - quote! { - #field_name: #field_type_colon::from_network_map(&mut { - #extract_inner - }), + match i.next().expect("failed to get next field") { + libquassel::primitive::Variant::#field_variant_type(var) => var.clone(), + _ => panic!("network::list::from: wrong variant type"), } - } else { - match field.variant.as_ref().map_or("", |m| m.as_str()) { - "VariantMap" => quote! { + }; + + if field.network { + if field.map { + quote! { #field_name: #field_type_colon::from_network_map(&mut { #extract_inner }), - }, - &_ => quote! { - #field_name: #field_type_colon::from_network(&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! { + #field_name: { + #extract_inner }, } } - } else { - quote! { - #field_name: { - #extract_inner - }, - } } }) .collect() |
