From c6788308f1ba70213470ff25d81424dd5076b381 Mon Sep 17 00:00:00 2001 From: HimbeerserverDE Date: Sun, 23 Jul 2023 19:30:51 +0200 Subject: Revert "Revert "support custom discriminant types"" This reverts commit 61418b7c9c62c0d8bac2ea494f742019ae037341. --- src/lib.rs | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 4e9a23d..ff31ef9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -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, - discriminant_for: Option, + discriminant_for: Option, +} + +#[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 { -- cgit v1.2.3