aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-07-23 19:30:51 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-07-23 19:30:51 +0200
commitc6788308f1ba70213470ff25d81424dd5076b381 (patch)
tree3dc08d814afa3eef16eacf27cbd4045f6702e9a7
parent84d5cd8a6cf4171451f2b82a4d84f407def1c168 (diff)
Revert "Revert "support custom discriminant types""
This reverts commit 61418b7c9c62c0d8bac2ea494f742019ae037341.
-rw-r--r--src/lib.rs23
1 files 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<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 {