diff options
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 23 |
1 files changed, 16 insertions, 7 deletions
@@ -1,6 +1,6 @@ use std::collections::HashMap; -use darling::FromAttributes; +use darling::{FromAttributes, FromMeta}; use proc_macro::TokenStream; use proc_macro2::{Ident, Span, TokenStream as TokenStream2}; use quote::quote; @@ -11,7 +11,13 @@ use syn::{parse, ItemStruct}; #[darling(default)] struct Args { len_for: Option<String>, - discriminant_for: Option<String>, + discriminant_for: Option<DiscriminantArgs>, +} + +#[derive(Debug, Default, FromMeta)] +struct DiscriminantArgs { + field: String, + data_type: String, } #[proc_macro_derive(Serialize, attributes(ppproperly))] @@ -27,11 +33,11 @@ pub fn derive_serialize(item: TokenStream) -> TokenStream { let args = Args::from_attributes(&field.attrs).unwrap(); if let Some(attr) = args.discriminant_for { - let attr_ident = Ident::new(&attr, Span::call_site()); + let field_ident = Ident::new(&attr.field, Span::call_site()); out.extend( vec![quote!( - self.#attr_ident.discriminant().serialize(w)?; + self.#field_ident.discriminant().serialize(w)?; )] .into_iter(), ); @@ -117,17 +123,20 @@ pub fn derive_deserialize(item: TokenStream) -> TokenStream { let args = Args::from_attributes(&field.attrs).unwrap(); if let Some(attr) = args.discriminant_for { + let field = attr.field; + let data_type = attr.data_type; + out.extend( vec![quote!( - let mut discriminant = 0u8; + let mut discriminant = #data_type::default(); discriminant.deserialize(r)?; - discriminant_for.insert(#attr, discriminant); + discriminant_for.insert(#field, discriminant); )] .into_iter(), ); - discriminant_for.insert(attr, ()); + discriminant_for.insert(field, ()); } if let Some(attr) = args.len_for { |