@@ -12,7 +12,7 @@ use quote::quote;
12
12
use syn:: DeriveInput ;
13
13
14
14
/// Derive `prometheus_client::encoding::EncodeLabelSet`.
15
- #[ proc_macro_derive( EncodeLabelSet ) ]
15
+ #[ proc_macro_derive( EncodeLabelSet , attributes ( prometheus ) ) ]
16
16
pub fn derive_encode_label_set ( input : TokenStream ) -> TokenStream {
17
17
let ast: DeriveInput = syn:: parse ( input) . unwrap ( ) ;
18
18
let name = & ast. ident ;
@@ -22,22 +22,40 @@ pub fn derive_encode_label_set(input: TokenStream) -> TokenStream {
22
22
syn:: Fields :: Named ( syn:: FieldsNamed { named, .. } ) => named
23
23
. into_iter ( )
24
24
. map ( |f| {
25
- let ident = f. ident . unwrap ( ) ;
26
- let ident_string = KEYWORD_IDENTIFIERS
25
+ let attribute = f
26
+ . attrs
27
27
. 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
+ }
41
59
}
42
60
} )
43
61
. collect ( ) ,
0 commit comments