From bacd995f8e7930650f859558a3d820e1fd42df79 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Tue, 21 Jan 2020 00:36:53 +0800 Subject: [PATCH] can run --- src/lib.rs | 30 ++---------------------------- src/parse.rs | 49 +++++++++++++++++++++++-------------------------- tests/test.rs | 7 ++----- 3 files changed, 27 insertions(+), 59 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 34e595e..00099ff 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,39 +10,13 @@ use syn::parse_macro_input; use parse::Input; -// #[proc_macro_attribute] -// pub fn dsample(attr: TokenStream, item: TokenStream) -> TokenStream { -// println!("attr: \"{}\"", attr.to_string()); -// println!("item: \"{}\"", item.to_string()); -// item -// } - -#[proc_macro_derive(Serialize_repr, attributes(dsample))] +#[proc_macro_derive(TestDerive, attributes(dsample))] pub fn derive_serialize(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as Input); - println!(""); println!("::::: {:?}", &input); - let ident = input.ident; - let repr = input.repr; - - let match_variants = input.variants.iter().map(|variant| { - let variant = &variant.ident; - quote! { - #ident::#variant => #ident::#variant as #repr, - } - }); + let _ident = input.ident; TokenStream::from(quote! { // println!("{}", #ident); - // impl serde::Serialize for #ident { - // fn serialize(&self, serializer: S) -> core::result::Result - // where S: serde::Serializer - // { - // let value: #repr = match *self { - // #(#match_variants)* - // }; - // serde::Serialize::serialize(&value, serializer) - // } - // } }) } diff --git a/src/parse.rs b/src/parse.rs index 0954413..bd2b36a 100644 --- a/src/parse.rs +++ b/src/parse.rs @@ -1,13 +1,11 @@ use proc_macro2::Span; -use syn::parse::{Error, Parse, ParseStream, Parser, Result}; -use syn::{parenthesized, Data, DeriveInput, Fields, Ident, Meta, NestedMeta}; +use syn::parse::{Error, Parse, ParseStream, Result}; +use syn::{Lit, Data, DeriveInput, Fields, Ident, Meta, NestedMeta}; #[derive(Debug)] pub struct Input { pub ident: Ident, // enum ident - pub repr: Ident, pub variants: Vec, - pub default_variant: Option, } #[derive(Clone, Debug)] @@ -43,7 +41,8 @@ fn parse_attrs(variant: &syn::Variant) -> Result { let meta = attr.parse_meta()?; if let Meta::List(value) = meta { for meta in &value.nested { - if let NestedMeta::Meta(Meta::Path(path)) = meta { + if let NestedMeta::Meta(Meta::Path(_path)) = meta { + // TODO ... // if path.is_ident("other") { // attrs.is_default = true; // } @@ -99,36 +98,34 @@ impl Parse for Input { println!(">>>>>>>>>>>>>>>>>>"); - let mut repr = None; + // get dsmple here for attr in derive_input.attrs { println!(">>>>>>> {:?}", &attr.tokens); - if attr.path.is_ident("repr") { - fn repr_arg(input: ParseStream) -> Result { - let content; - parenthesized!(content in input); - content.parse() + if attr.path.is_ident("dsample") { + match attr.parse_meta() { + Ok(Meta::List(meta)) => { + let list: Vec = meta.nested.into_iter().collect(); + for nested_meta in list.iter() { + match nested_meta { + NestedMeta::Meta(Meta::NameValue(nv)) => { + if let Lit::Str(lit) = &nv.lit { + if nv.path.is_ident("a") { + println!("------------------------------ a = {}", &lit.value()); + } + } + }, + _ => (), + } + } + }, + _ => (), } - let ty = repr_arg.parse2(attr.tokens)?; - repr = Some(ty); - break; } } - let repr = repr.ok_or_else(|| Error::new(call_site, "missing #[repr(...)] attribute"))?; - - let mut default_variants = variants.iter().filter(|x| x.attrs.is_default); - let default_variant = default_variants.next().cloned(); - if default_variants.next().is_some() { - return Err(Error::new( - call_site, - "only one variant can be #[serde(other)]", - )); - } Ok(Input { ident: derive_input.ident, - repr, variants, - default_variant, }) } } \ No newline at end of file diff --git a/tests/test.rs b/tests/test.rs index ee75f8f..bea03c9 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -1,12 +1,9 @@ -use derive_sample::{Serialize_repr}; -// use derive_sample::dsample; +use derive_sample::{TestDerive}; mod small_prime { use super::*; - // #[dsample(name = "X")] - #[derive(Serialize_repr)] - #[repr(u8)] + #[derive(TestDerive)] #[dsample(a= "b")] enum SmallPrime { Two = 2,