@@ -16,38 +16,55 @@ pub fn render_output(input: TokenStream) -> TokenStream {
1616 let ast: DeriveInput = parse_macro_input ! ( input as DeriveInput ) ;
1717
1818 let name = & ast. ident ;
19- let fields : Vec < _ > = match ast. data {
19+ let render_span = match ast. data {
2020 Data :: Struct ( s) => match s. fields {
21- Fields :: Named ( ..) => s
22- . fields
23- . iter ( )
24- . map ( |x| {
25- let x = x. ident . clone ( ) . unwrap ( ) ;
26- ( x. to_string ( ) , quote ! ( #x) )
27- } ) . collect ( ) ,
28- Fields :: Unnamed ( ..) => s
29- . fields
30- . iter ( )
31- . enumerate ( )
32- . map ( |( i, _) | ( i. to_string ( ) , quote ! ( #i) ) )
33- . collect ( ) ,
21+ Fields :: Named ( ..) => {
22+ let fields = s. fields . iter ( ) . map ( |f| {
23+ let x = f. ident . clone ( ) . unwrap ( ) ;
24+ quote ! ( #x)
25+ } ) ;
26+ let names = s
27+ . fields
28+ . iter ( )
29+ . map ( |f| f. ident . clone ( ) . unwrap ( ) . to_string ( ) ) ;
30+ quote ! {
31+ let mut span = output:: components:: span( ) ;
32+ #(
33+ span = span. add_item( #names) ;
34+ span = span. add_item( ": " ) ;
35+ span = span. add_item( output:: components:: text( & self . #fields. to_string( ) ) ) ;
36+ span = span. add_item( "\n " ) ;
37+ ) *
38+ span. render_for_humans( fmt) ?;
39+ }
40+ }
41+ Fields :: Unnamed ( ..) => {
42+ let field_count = s. fields . iter ( ) . count ( ) ;
43+ let fields = ( 0 ..field_count)
44+ . fold ( Vec :: new ( ) , |mut res, i| {
45+ res. push ( quote ! { span = span. add_item( output:: components:: text( & self . #i. to_string( ) ) ) ; } ) ;
46+ if i < field_count - 1 {
47+ res. push ( quote ! { span = span. add_item( ", " ) ; } ) ;
48+ }
49+ res
50+ } ) ;
51+
52+ quote ! {
53+ let mut span = output:: components:: span( ) ;
54+ span = span. add_item( "(" ) ;
55+ #( #fields) *
56+ span = span. add_item( ")" ) ;
57+ span. render_for_humans( fmt) ?;
58+ }
59+ }
3460 _ => panic ! ( "Unit structs not supported for now, sorry." ) ,
3561 } ,
3662 _ => panic ! ( "Only structs supported for now, sorry." ) ,
3763 } ;
38- let names = fields. iter ( ) . map ( |( name, _) | name) ;
39- let fields = fields. iter ( ) . map ( |( _, ident) | ident) ;
4064 let exp = quote ! {
4165 impl output:: Render for #name {
4266 fn render_for_humans( & self , fmt: & mut output:: human:: Formatter ) -> Result <( ) , output:: Error > {
43- let mut span = output:: components:: span( ) ;
44- #(
45- span = span. add_item( #names) ;
46- span = span. add_item( ": " ) ;
47- span = span. add_item( output:: components:: text( & self . #fields. to_string( ) ) ) ;
48- span = span. add_item( "\n " ) ;
49- ) *
50- span. render_for_humans( fmt) ?;
67+ #render_span
5168 Ok ( ( ) )
5269 }
5370
0 commit comments