aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-05-21 11:16:15 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-05-21 11:16:15 +0200
commit75959ed985af16ab9f141c79ae2d2dac2ee2a0a5 (patch)
tree2661f6c767e4022a7276d11f2cb85a6a96da19ad
parentbe54d15d4695462ff425bad63d9dbbdd57890e20 (diff)
make serialize deriver process length and discriminant annotations
-rw-r--r--src/lib.rs41
1 files changed, 35 insertions, 6 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 649b524..aaa12df 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,3 +1,5 @@
+use std::collections::HashMap;
+
use darling::FromAttributes;
use proc_macro::TokenStream;
use proc_macro2::TokenStream as TokenStream2;
@@ -12,17 +14,44 @@ struct Args {
discriminant_for: Option<String>,
}
-#[proc_macro_derive(Serialize)]
+#[proc_macro_derive(Serialize, attributes(ppproperly))]
pub fn derive_serialize(item: TokenStream) -> TokenStream {
let ast: ItemStruct = parse(item).unwrap();
let name = ast.ident;
let serializers = ast.fields.iter().map(|field| {
+ let mut out = TokenStream2::new();
+
let field_name = field.ident.as_ref().expect("should be a names struct");
- quote!(
- self.#field_name.serialize(w)?;
- )
+ let args = Args::from_attributes(&field.attrs).unwrap();
+
+ if let Some(attr) = args.len_for {
+ out.extend(
+ vec![quote!(
+ self.#attr.len().serialize(w)?;
+ )]
+ .into_iter(),
+ );
+ }
+
+ if let Some(attr) = args.discriminant_for {
+ out.extend(
+ vec![quote!(
+ self.#attr.discriminant().serialize(w)?;
+ )]
+ .into_iter(),
+ );
+ }
+
+ out.extend(
+ vec![quote!(
+ self.#field_name.serialize(w)?;
+ )]
+ .into_iter(),
+ );
+
+ out
});
quote!(
@@ -42,8 +71,8 @@ pub fn derive_deserialize(item: TokenStream) -> TokenStream {
let ast: ItemStruct = parse(item).unwrap();
let name = ast.ident;
- let mut len_for = std::collections::HashMap::new();
- let mut discriminant_for = std::collections::HashMap::new();
+ let mut len_for = HashMap::new();
+ let mut discriminant_for = HashMap::new();
let has_len_annotations = ast.fields.iter().any(|field| {
let args = Args::from_attributes(&field.attrs).unwrap();