@@ -2,31 +2,29 @@ extern crate proc_macro;
22
33use proc_macro:: TokenStream ;
44use quote:: quote;
5- use syn:: { parse_macro_input, DeriveInput , Data , Fields } ;
5+ use syn:: { parse_macro_input, Data , DeriveInput , Fields } ;
66
77#[ proc_macro_derive( Query ) ]
88pub fn derive_query ( input : TokenStream ) -> TokenStream {
99 let input = parse_macro_input ! ( input as DeriveInput ) ;
1010 let name = input. ident ;
1111 let ( impl_generics, ty_generics, where_clause) = input. generics . split_for_impl ( ) ;
1212 let ret = match input. data {
13- Data :: Struct ( data_struct) => {
14- match data_struct. fields {
15- Fields :: Named ( fields) => {
16- let field_names: Vec < _ > = fields. named . iter ( ) . map ( |f| & f. ident ) . collect ( ) ;
17- assert ! ( !field_names. is_empty( ) , "can't derive on empty field" ) ;
18- quote ! {
19- impl #impl_generics :: skytable:: query:: SQParam for #name #ty_generics #where_clause {
20- fn append_param( & self , q: & mut Vec <u8 >) -> usize {
21- let mut size = 0 ;
22- #( size += :: skytable:: query:: SQParam :: append_param( & self . #field_names, q) ; ) *
23- size
24- }
13+ Data :: Struct ( data_struct) => match data_struct. fields {
14+ Fields :: Named ( fields) => {
15+ let field_names: Vec < _ > = fields. named . iter ( ) . map ( |f| & f. ident ) . collect ( ) ;
16+ assert ! ( !field_names. is_empty( ) , "can't derive on empty field" ) ;
17+ quote ! {
18+ impl #impl_generics :: skytable:: query:: SQParam for #name #ty_generics #where_clause {
19+ fn append_param( & self , q: & mut Vec <u8 >) -> usize {
20+ let mut size = 0 ;
21+ #( size += :: skytable:: query:: SQParam :: append_param( & self . #field_names, q) ; ) *
22+ size
2523 }
2624 }
27- } ,
28- _ => unimplemented ! ( ) ,
25+ }
2926 }
27+ _ => unimplemented ! ( ) ,
3028 } ,
3129 _ => unimplemented ! ( ) ,
3230 } ;
@@ -39,24 +37,26 @@ pub fn derive_response(input: TokenStream) -> TokenStream {
3937 let name = input. ident ;
4038 let ( impl_generics, ty_generics, where_clause) = input. generics . split_for_impl ( ) ;
4139 let ret = match input. data {
42- Data :: Struct ( data_struct) => {
43- match data_struct. fields {
44- Fields :: Named ( fields) => {
45- let field_names: Vec < _ > = fields. named . iter ( ) . map ( |f| & f. ident ) . collect ( ) ;
46- assert ! ( !field_names. is_empty( ) , "can't derive on empty field" ) ;
47- let tuple_pattern = quote ! { ( #( #field_names) , * ) } ;
48- let struct_instantiation = quote ! { Self { #( #field_names) , * } } ;
49- quote ! {
50- impl #impl_generics skytable:: response:: FromResponse for #name #ty_generics #where_clause {
51- fn from_response( resp: skytable:: response:: Response ) -> skytable:: ClientResult <Self > {
52- let #tuple_pattern = skytable:: response:: FromResponse :: from_response( resp) ?;
53- Ok ( #struct_instantiation)
54- }
40+ Data :: Struct ( data_struct) => match data_struct. fields {
41+ Fields :: Named ( fields) => {
42+ let field_names: Vec < _ > = fields. named . iter ( ) . map ( |f| & f. ident ) . collect ( ) ;
43+ assert ! ( !field_names. is_empty( ) , "can't derive on empty field" ) ;
44+ let tuple_pattern = if field_names. len ( ) == 1 {
45+ quote ! { quote! { ( #( #field_names) , * , ) } }
46+ } else {
47+ quote ! { ( #( #field_names) , * ) }
48+ } ;
49+ let struct_instantiation = quote ! { Self { #( #field_names) , * } } ;
50+ quote ! {
51+ impl #impl_generics skytable:: response:: FromResponse for #name #ty_generics #where_clause {
52+ fn from_response( resp: skytable:: response:: Response ) -> skytable:: ClientResult <Self > {
53+ let #tuple_pattern = skytable:: response:: FromResponse :: from_response( resp) ?;
54+ Ok ( #struct_instantiation)
5555 }
5656 }
57- } ,
58- _ => unimplemented ! ( ) ,
57+ }
5958 }
59+ _ => unimplemented ! ( ) ,
6060 } ,
6161 _ => unimplemented ! ( ) ,
6262 } ;
0 commit comments