diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-07-23 19:30:51 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-07-23 19:30:51 +0200 |
commit | c6788308f1ba70213470ff25d81424dd5076b381 (patch) | |
tree | 3dc08d814afa3eef16eacf27cbd4045f6702e9a7 | |
parent | 84d5cd8a6cf4171451f2b82a4d84f407def1c168 (diff) |
Revert "Revert "support custom discriminant types""
This reverts commit 61418b7c9c62c0d8bac2ea494f742019ae037341.
-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 { |