diff options
| author | Max Audron <audron@cocaine.farm> | 2021-01-21 14:57:41 +0100 |
|---|---|---|
| committer | Max Audron <audron@cocaine.farm> | 2021-01-21 14:57:41 +0100 |
| commit | 6a6b1197f4ebc826c6b15eb3ca7f9e3efca1be19 (patch) | |
| tree | 2e6771af51fe1aec0da0e5d44b2c9ba7318451fa /derive/src/to_network_impl.rs | |
| parent | reorganize tests and add quassel features (diff) | |
add to and from network derive
Diffstat (limited to 'derive/src/to_network_impl.rs')
| -rw-r--r-- | derive/src/to_network_impl.rs | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/derive/src/to_network_impl.rs b/derive/src/to_network_impl.rs new file mode 100644 index 0000000..4a8501d --- /dev/null +++ b/derive/src/to_network_impl.rs @@ -0,0 +1,96 @@ +use proc_macro2::TokenStream; +use quote::quote; + +use crate::{get_field_type, NetworkField}; + +pub(crate) fn map(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); + + if field.to_map.is_some() { + let field_map: syn::ExprClosure = + syn::parse_str(&field.to_map.as_ref().unwrap()).unwrap(); + + quote! { + res.insert(#field_rename.to_string(), + crate::primitive::Variant::#field_type(self.#field_name.iter().map(#field_map).collect())); + } + } else { + quote! { + res.insert(#field_rename.to_string(), + crate::primitive::Variant::#field_type(self.#field_name.clone())); + } + } + }) + .collect() +} + +pub(crate) fn map_list(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); + + if field.to_map.is_some() { + let field_map: syn::ExprClosure = + syn::parse_str(&field.to_map.as_ref().unwrap()).unwrap(); + + quote! { + res.insert(#field_rename.to_string(), + crate::primitive::Variant::VariantList( + std::vec::from_elem(crate::primitive::Variant::#field_type(self.#field_name.iter().map(#field_map).collect()), 1))); + } + } 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))); + } + } + }) + .collect() +} + +pub(crate) fn list(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); + + if field.to_map.is_some() { + let field_map: syn::ExprClosure = + syn::parse_str(&field.to_map.as_ref().unwrap()).unwrap(); + + quote! { + res.push(crate::primitive::Variant::ByteArray(#field_rename.to_string())); + res.push(crate::primitive::Variant::#field_type(self.#field_name.iter().map(#field_map).collect())); + } + } else { + quote! { + res.push(crate::primitive::Variant::ByteArray(#field_rename.to_string())); + res.push(crate::primitive::Variant::#field_type(self.#field_name.clone())); + } + } + }) + .collect() +} |
