@@ -12,7 +12,7 @@ use quote::quote;
1212use syn:: DeriveInput ;
1313
1414/// Derive `prometheus_client::encoding::EncodeLabelSet`.
15- #[ proc_macro_derive( EncodeLabelSet ) ]
15+ #[ proc_macro_derive( EncodeLabelSet , attributes ( prometheus ) ) ]
1616pub fn derive_encode_label_set ( input : TokenStream ) -> TokenStream {
1717 let ast: DeriveInput = syn:: parse ( input) . unwrap ( ) ;
1818 let name = & ast. ident ;
@@ -22,22 +22,40 @@ pub fn derive_encode_label_set(input: TokenStream) -> TokenStream {
2222 syn:: Fields :: Named ( syn:: FieldsNamed { named, .. } ) => named
2323 . into_iter ( )
2424 . map ( |f| {
25- let ident = f. ident . unwrap ( ) ;
26- let ident_string = KEYWORD_IDENTIFIERS
25+ let attribute = f
26+ . attrs
2727 . iter ( )
28- . find ( |pair| ident == pair. 1 )
29- . map ( |pair| pair. 0 . to_string ( ) )
30- . unwrap_or_else ( || ident. to_string ( ) ) ;
31-
32- quote ! {
33- let mut label_encoder = encoder. encode_label( ) ;
34- let mut label_key_encoder = label_encoder. encode_label_key( ) ?;
35- EncodeLabelKey :: encode( & #ident_string, & mut label_key_encoder) ?;
36-
37- let mut label_value_encoder = label_key_encoder. encode_label_value( ) ?;
38- EncodeLabelValue :: encode( & self . #ident, & mut label_value_encoder) ?;
39-
40- label_value_encoder. finish( ) ?;
28+ . find ( |a| a. path . is_ident ( "prometheus" ) )
29+ . map ( |a| a. parse_args :: < syn:: Ident > ( ) . unwrap ( ) . to_string ( ) ) ;
30+ let flatten = match attribute. as_deref ( ) {
31+ Some ( "flatten" ) => true ,
32+ Some ( other) => {
33+ panic ! ( "Provided attribute '{other}', but only 'flatten' is supported" )
34+ }
35+ None => false ,
36+ } ;
37+ let ident = f. ident . unwrap ( ) ;
38+ if flatten {
39+ quote ! {
40+ EncodeLabelSet :: encode( & self . #ident, encoder) ?;
41+ }
42+ } else {
43+ let ident_string = KEYWORD_IDENTIFIERS
44+ . iter ( )
45+ . find ( |pair| ident == pair. 1 )
46+ . map ( |pair| pair. 0 . to_string ( ) )
47+ . unwrap_or_else ( || ident. to_string ( ) ) ;
48+
49+ quote ! {
50+ let mut label_encoder = encoder. encode_label( ) ;
51+ let mut label_key_encoder = label_encoder. encode_label_key( ) ?;
52+ EncodeLabelKey :: encode( & #ident_string, & mut label_key_encoder) ?;
53+
54+ let mut label_value_encoder = label_key_encoder. encode_label_value( ) ?;
55+ EncodeLabelValue :: encode( & self . #ident, & mut label_value_encoder) ?;
56+
57+ label_value_encoder. finish( ) ?;
58+ }
4159 }
4260 } )
4361 . collect ( ) ,
0 commit comments