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.rs192
1 files changed, 102 insertions, 90 deletions
diff --git a/derive/src/network/maplist.rs b/derive/src/network/maplist.rs
index 01d1e20..94eb04b 100644
--- a/derive/src/network/maplist.rs
+++ b/derive/src/network/maplist.rs
@@ -9,36 +9,40 @@ 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 {
- quote! {
- self.#field_name.to_network().into()
- }
- } else {
- quote! {
- self.#field_name.clone().into()
- }
- };
+ 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(),
- libquassel::primitive::Variant::#field_type(
- std::vec::from_elem(#field_inner, 1)));
+ if let Some(_) = field.variant {
+ quote! {
+ res.insert(#field_rename.to_string(),
+ libquassel::primitive::Variant::#field_type(
+ std::vec::from_elem(#field_inner, 1)));
+ }
+ } else {
+ quote! {
+ res.insert(#field_rename.to_string(),
+ libquassel::primitive::Variant::VariantList(
+ std::vec::from_elem(#field_inner, 1)));
+ }
}
} else {
- quote! {
- res.insert(#field_rename.to_string(),
- libquassel::primitive::Variant::VariantList(
- std::vec::from_elem(#field_inner, 1)));
- }
+ quote! {}
}
})
.collect()
@@ -52,54 +56,56 @@ pub(crate) fn to_vec(_type_name: &Ident, fields: &Vec<NetworkField>) -> TokenStr
) = fields.iter().fold(
(Vec::new(), Vec::new(), Vec::new()),
|(mut lists, mut for_each_inner, mut map_inserts), 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_variant_type(&field);
-
- let field_inner = if field.network {
- if field.map {
- quote! {
- item.#field_name.to_network_map()
+ 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_inner = if field.network {
+ if field.map {
+ quote! {
+ item.#field_name.to_network_map()
+ }
+ } else {
+ quote! {
+ item.#field_name.to_network()
+ }
}
} else {
quote! {
- item.#field_name.to_network()
+ item.#field_name.clone()
}
- }
- } else {
- quote! {
- item.#field_name.clone()
- }
- };
+ };
- if let Some(_) = field.variant {
- lists.push(quote! {
- let mut #field_name: libquassel::primitive::StringList = Vec::with_capacity(self.len());
- });
+ if let Some(_) = field.variant {
+ lists.push(quote! {
+ let mut #field_name: libquassel::primitive::StringList = Vec::with_capacity(self.len());
+ });
- for_each_inner.push(quote! {
- #field_name.push(#field_inner);
- });
+ for_each_inner.push(quote! {
+ #field_name.push(#field_inner);
+ });
- map_inserts.push(quote! {
- map.insert(String::from(#field_rename), libquassel::primitive::Variant::StringList(#field_name));
- });
- } else {
- lists.push(quote! {
- let mut #field_name: libquassel::primitive::VariantList = Vec::with_capacity(self.len());
- });
+ map_inserts.push(quote! {
+ map.insert(String::from(#field_rename), libquassel::primitive::Variant::StringList(#field_name));
+ });
+ } else {
+ lists.push(quote! {
+ let mut #field_name: libquassel::primitive::VariantList = Vec::with_capacity(self.len());
+ });
- for_each_inner.push(quote! {
- #field_name.push(libquassel::primitive::Variant::#field_type(#field_inner));
- });
+ for_each_inner.push(quote! {
+ #field_name.push(libquassel::primitive::Variant::#field_type(#field_inner));
+ });
- map_inserts.push(quote! {
- map.insert(String::from(#field_rename), libquassel::primitive::Variant::VariantList(#field_name));
- });
+ map_inserts.push(quote! {
+ map.insert(String::from(#field_rename), libquassel::primitive::Variant::VariantList(#field_name));
+ });
+ }
}
return (lists, for_each_inner, map_inserts);
@@ -125,38 +131,44 @@ 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_variant_type(&field);
-
- let field_inner = if field.network {
+ if field.default {
quote! {
- libquassel::message::Network::from_network(&mut std::convert::TryInto::try_into(input.remove(0)).unwrap())
+ #field_name: Default::default(),
}
} else {
- quote! {
- std::convert::TryInto::try_into(input.remove(0)).unwrap()
- }
- };
+ let field_rename = match &field.rename {
+ Some(name) => name.clone(),
+ None => format!("{}", field.ident.as_ref().unwrap()).into(),
+ };
- if let Some(_) = field.variant {
- quote! {
- #field_name: match input.get_mut(#field_rename).unwrap() {
- libquassel::primitive::Variant::#field_type(input) => #field_inner,
- _ => panic!("#field_name: wrong variant")
- },
- }
- } else {
- quote! {
- #field_name: match input.get_mut(#field_rename).unwrap() {
- libquassel::primitive::Variant::VariantList(input) => #field_inner,
- _ => panic!("#field_name: wrong variant")
- },
+ let field_type = get_field_variant_type(&field);
+
+ let field_inner = if field.network {
+ quote! {
+ libquassel::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()
+ }
+ };
+
+ if let Some(_) = field.variant {
+ quote! {
+ #field_name: match input.get_mut(#field_rename).unwrap() {
+ libquassel::primitive::Variant::#field_type(input) => #field_inner,
+ _ => panic!("#field_name: wrong variant")
+ },
+ }
+ } else {
+ quote! {
+ #field_name: match input.get_mut(#field_rename).unwrap() {
+ libquassel::primitive::Variant::VariantList(input) => #field_inner,
+ _ => panic!("#field_name: wrong variant")
+ },
+ }
}
}
})