diff options
Diffstat (limited to 'derive/src/network/maplist.rs')
| -rw-r--r-- | derive/src/network/maplist.rs | 132 |
1 files changed, 78 insertions, 54 deletions
diff --git a/derive/src/network/maplist.rs b/derive/src/network/maplist.rs index c92b279..09fbe50 100644 --- a/derive/src/network/maplist.rs +++ b/derive/src/network/maplist.rs @@ -1,6 +1,8 @@ use proc_macro2::{Ident, TokenStream}; use quote::quote; +use crate::network::get_field_variant_type; + use super::{get_field_type, NetworkField}; pub(crate) fn to(fields: &Vec<NetworkField>) -> Vec<TokenStream> { @@ -13,21 +15,29 @@ pub(crate) fn to(fields: &Vec<NetworkField>) -> Vec<TokenStream> { }; let field_name = field.ident.as_ref().unwrap(); - let field_type = get_field_type(&field); - - match &field.variant { - Some(variant_type) => match variant_type.as_str() { - "StringList" => quote! { - res.insert(#field_rename.to_string(), - crate::primitive::Variant::StringList( - std::vec::from_elem(self.#field_name.clone(), 1))); - }, - _ => panic!("network::map::to: not one of the avaible variants") + let field_type = get_field_variant_type(&field); + + let field_inner = if field.network { + quote! { + self.#field_name.to_network().into() + } + } else { + quote! { + self.#field_name.clone().into() + } + }; + + if let Some(_) = field.variant { + quote! { + res.insert(#field_rename.to_string(), + crate::primitive::Variant::#field_type( + std::vec::from_elem(#field_inner, 1))); } - None => quote! { + } else { + quote! { res.insert(#field_rename.to_string(), crate::primitive::Variant::VariantList( - std::vec::from_elem(crate::primitive::Variant::#field_type(self.#field_name.clone()), 1))); + std::vec::from_elem(#field_inner, 1))); } } }) @@ -48,38 +58,42 @@ pub(crate) fn to_vec(_type_name: &Ident, fields: &Vec<NetworkField>) -> TokenStr }; let field_name = field.ident.as_ref().unwrap(); - let field_type = get_field_type(&field); - - match &field.variant { - None => { - lists.push(quote! { - let mut #field_name: crate::primitive::VariantList = Vec::with_capacity(self.len()); - }); - - for_each_inner.push(quote! { - #field_name.push(crate::primitive::Variant::#field_type(item.#field_name.clone())); - }); + let field_type = get_field_variant_type(&field); - map_inserts.push(quote! { - map.insert(String::from(#field_rename), crate::primitive::Variant::VariantList(#field_name)); - }); + let field_inner = if field.network { + quote! { + item.#field_name.to_network() } - Some(variant_type) => match variant_type.as_str() { - "StringList" => { - lists.push(quote! { - let mut #field_name: crate::primitive::StringList = Vec::with_capacity(self.len()); - }); - - for_each_inner.push(quote! { - #field_name.push(item.#field_name.clone()); - }); - - map_inserts.push(quote! { - map.insert(String::from(#field_rename), crate::primitive::Variant::StringList(#field_name)); - }); - } - _ => panic!("network::map::to: not one of the avaible variants") + } else { + quote! { + item.#field_name.clone() } + }; + + if let Some(_) = field.variant { + lists.push(quote! { + let mut #field_name: crate::primitive::StringList = Vec::with_capacity(self.len()); + }); + + for_each_inner.push(quote! { + #field_name.push(#field_inner); + }); + + map_inserts.push(quote! { + map.insert(String::from(#field_rename), crate::primitive::Variant::StringList(#field_name)); + }); + } else { + lists.push(quote! { + let mut #field_name: crate::primitive::VariantList = Vec::with_capacity(self.len()); + }); + + for_each_inner.push(quote! { + #field_name.push(crate::primitive::Variant::#field_type(#field_inner)); + }); + + map_inserts.push(quote! { + map.insert(String::from(#field_rename), crate::primitive::Variant::VariantList(#field_name)); + }); } return (lists, for_each_inner, map_inserts); @@ -112,23 +126,31 @@ pub(crate) fn from(fields: &Vec<NetworkField>) -> Vec<TokenStream> { let field_name = field.ident.as_ref().unwrap(); - let _field_type = get_field_type(&field); + let field_type = get_field_variant_type(&field); + + let field_inner = if field.network { + quote! { + crate::message::Network::from_network(&mut std::convert::TryInto::try_into(input.remove(0)).unwrap()) + } + } else { + quote! { + std::convert::TryInto::try_into(input.remove(0)).unwrap() + } + }; - match &field.variant { - None => quote! { + if let Some(_) = field.variant { + quote! { #field_name: match input.get_mut(#field_rename).unwrap() { - crate::primitive::Variant::VariantList(input) => std::convert::TryInto::try_into(input.remove(0)).unwrap(), + crate::primitive::Variant::#field_type(input) => #field_inner, _ => panic!("#field_name: wrong variant") }, - }, - Some(variant_type) => match variant_type.as_str() { - "StringList" => quote! { - #field_name: match input.get_mut(#field_rename).unwrap() { - crate::primitive::Variant::StringList(input) => input.remove(0), - _ => panic!("#field_name: wrong variant") - }, + } + } else { + quote! { + #field_name: match input.get_mut(#field_rename).unwrap() { + crate::primitive::Variant::VariantList(input) => #field_inner, + _ => panic!("#field_name: wrong variant") }, - _ => panic!("network::map::to: not one of the avaible variants"), } } }) @@ -145,12 +167,14 @@ pub(crate) fn from_vec(type_name: &Ident, fields: &Vec<NetworkField>) -> TokenSt let _field_name = field.ident.as_ref().unwrap(); + let field_type = get_field_variant_type(field); + let field_variant = match &field.variant { None => quote! {crate::primitive::VariantList}, Some(variant_type) => match variant_type.as_str() { "StringList" => quote! {crate::primitive::StringList}, "VariantMap" => quote! {crate::primitive::VariantMap}, - _ => panic!("network::map::from_vec: not one of the avaible variants"), + _ => quote! {crate::primitive::VariantMap}, }, }; |
