aboutsummaryrefslogtreecommitdiff
path: root/derive/src/network/maplist.rs
diff options
context:
space:
mode:
Diffstat (limited to 'derive/src/network/maplist.rs')
-rw-r--r--derive/src/network/maplist.rs132
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},
},
};