diff options
Diffstat (limited to 'derive/src/network/map.rs')
| -rw-r--r-- | derive/src/network/map.rs | 73 |
1 files changed, 59 insertions, 14 deletions
diff --git a/derive/src/network/map.rs b/derive/src/network/map.rs index 60f96b5..506ccb3 100644 --- a/derive/src/network/map.rs +++ b/derive/src/network/map.rs @@ -17,8 +17,19 @@ pub(crate) fn to(fields: &Vec<NetworkField>) -> Vec<TokenStream> { let field_variant_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! { @@ -28,7 +39,7 @@ pub(crate) fn to(fields: &Vec<NetworkField>) -> Vec<TokenStream> { quote! { res.insert(#field_rename.to_string(), - crate::primitive::Variant::#field_variant_type(#field_inner)); + libquassel::primitive::Variant::#field_variant_type(#field_inner)); } }) .collect() @@ -50,9 +61,23 @@ pub(crate) fn from(fields: &Vec<NetworkField>) -> Vec<TokenStream> { let field_type_colon = get_field_type_colon(field_type.clone()); if field.network { - quote! { - #field_name: #field_type_colon::from_network( - &mut std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).unwrap()), + if field.map { + quote! { + #field_name: #field_type_colon::from_network_map( + &mut std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).unwrap()), + } + } else { + match field.variant.as_ref().map_or("", |m| m.as_str()) { + "VariantMap" => quote! { + #field_name: #field_type_colon::from_network_map( + &mut std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).unwrap()), + }, + + &_ => quote! { + #field_name: #field_type_colon::from_network( + &mut std::convert::TryInto::try_into(input.remove(#field_rename).unwrap()).unwrap()), + } + } } } else { quote! { @@ -63,16 +88,36 @@ pub(crate) fn from(fields: &Vec<NetworkField>) -> Vec<TokenStream> { .collect() } -pub(crate) fn to_vec(_type_name: &Ident, _fields: &Vec<NetworkField>) -> TokenStream { - quote! { - self.iter().map(|item| { - item.to_network().into() - }).collect() +pub(crate) fn to_vec(_type_name: &Ident, _fields: &Vec<NetworkField>, new: bool) -> TokenStream { + if new { + quote! { + self.iter().map(|item| { + item.to_network_map().into() + }).collect() + } + } else { + quote! { + self.iter().map(|item| { + item.to_network().into() + }).collect() + } } } -pub(crate) fn from_vec(type_name: &Ident, _fields: &Vec<NetworkField>) -> TokenStream { - quote! { - input.iter().map(|item| #type_name::from_network(&mut std::convert::TryInto::try_into(item).unwrap())).collect() +pub(crate) fn from_vec(type_name: &Ident, _fields: &Vec<NetworkField>, new: bool) -> TokenStream { + if new { + quote! { + input.iter().map( + |item| #type_name::from_network_map( + &mut std::convert::TryInto::try_into(item).unwrap() + )).collect() + } + } else { + quote! { + input.iter().map( + |item| #type_name::from_network( + &mut std::convert::TryInto::try_into(item).unwrap() + )).collect() + } } } |
