11use proc_macro:: TokenStream ;
22use quote:: quote;
33use syn:: {
4- AttributeArgs , DeriveInput , GenericParam , LifetimeDef , Meta , NestedMeta , WhereClause ,
5- parse_macro_input ,
4+ DeriveInput , GenericParam , LifetimeParam , Meta , Token , WhereClause , parse_macro_input ,
5+ punctuated :: Punctuated ,
66} ;
77
88#[ proc_macro_attribute]
99pub fn context_deserialize ( attr : TokenStream , item : TokenStream ) -> TokenStream {
10- let args = parse_macro_input ! ( attr as AttributeArgs ) ;
10+ let args = parse_macro_input ! ( attr with Punctuated :: < Meta , Token ! [ , ] > :: parse_terminated ) ;
1111 let input = parse_macro_input ! ( item as DeriveInput ) ;
1212 let ident = & input. ident ;
1313
@@ -16,11 +16,15 @@ pub fn context_deserialize(attr: TokenStream, item: TokenStream) -> TokenStream
1616
1717 for meta in args {
1818 match meta {
19- NestedMeta :: Meta ( Meta :: Path ( p) ) => {
19+ Meta :: Path ( p) => {
2020 ctx_types. push ( p) ;
2121 }
22- NestedMeta :: Meta ( Meta :: NameValue ( nv) ) if nv. path . is_ident ( "bound" ) => {
23- if let syn:: Lit :: Str ( lit_str) = & nv. lit {
22+ Meta :: NameValue ( nv) if nv. path . is_ident ( "bound" ) => {
23+ if let syn:: Expr :: Lit ( syn:: ExprLit {
24+ lit : syn:: Lit :: Str ( lit_str) ,
25+ ..
26+ } ) = & nv. value
27+ {
2428 let where_string = format ! ( "where {}" , lit_str. value( ) ) ;
2529 match syn:: parse_str :: < WhereClause > ( & where_string) {
2630 Ok ( where_clause) => {
@@ -76,7 +80,7 @@ pub fn context_deserialize(attr: TokenStream, item: TokenStream) -> TokenStream
7680 // Ensure 'de lifetime exists in impl generics
7781 let has_de = impl_generics
7882 . lifetimes ( )
79- . any ( |LifetimeDef { lifetime, .. } | lifetime. ident == "de" ) ;
83+ . any ( |LifetimeParam { lifetime, .. } | lifetime. ident == "de" ) ;
8084
8185 if !has_de {
8286 impl_generics. params . insert ( 0 , syn:: parse_quote! { ' de } ) ;
0 commit comments