1
1
use proc_macro:: TokenStream ;
2
- use proc_macro2:: TokenStream as TokenStream2 ;
2
+ use proc_macro2:: { TokenStream as TokenStream2 , TokenTree as TokenTree2 } ;
3
3
use quote:: { format_ident, quote} ;
4
4
use syn:: { parse_macro_input, Field , Fields , Ident , ItemStruct } ;
5
5
6
+ #[ derive( Debug ) ]
6
7
struct WriteableField {
7
8
ident : Ident ,
8
9
is_tag : bool ,
10
+ is_ignore : bool ,
9
11
}
10
12
11
13
impl From < Field > for WriteableField {
12
14
fn from ( field : Field ) -> WriteableField {
13
15
let ident = field. ident . expect ( "fields without ident are not supported" ) ;
14
- let is_tag = field. attrs . iter ( ) . any ( |attr| {
16
+
17
+ let check_influx_aware = |attr : & syn:: Attribute | -> bool {
15
18
attr. path
16
19
. segments
17
20
. iter ( )
18
21
. last ( )
19
22
. map ( |seg| seg. ident . to_string ( ) )
20
23
. unwrap_or_default ( )
21
- == "tag"
24
+ == "influx_aware"
25
+ } ;
26
+
27
+ let check_for_attr = |token_tree, ident_cmp : & str | -> bool {
28
+ match token_tree {
29
+ TokenTree2 :: Group ( group) => group
30
+ . stream ( )
31
+ . into_iter ( )
32
+ . next ( )
33
+ . map ( |token_tree| match token_tree {
34
+ TokenTree2 :: Ident ( ident) => ident. to_string ( ) == ident_cmp. to_string ( ) ,
35
+ _ => false ,
36
+ } )
37
+ . unwrap ( ) ,
38
+ _ => false ,
39
+ }
40
+ } ;
41
+
42
+ let is_ignore = field. attrs . iter ( ) . any ( |attr| {
43
+ if !check_influx_aware ( attr) {
44
+ return false ;
45
+ }
46
+
47
+ attr. tokens
48
+ . clone ( )
49
+ . into_iter ( )
50
+ . next ( )
51
+ . map ( |token_tree| check_for_attr ( token_tree, "ignore" ) )
52
+ . unwrap ( )
22
53
} ) ;
23
- WriteableField { ident, is_tag }
54
+
55
+ let is_tag = field. attrs . iter ( ) . any ( |attr| {
56
+ if !check_influx_aware ( attr) {
57
+ return false ;
58
+ }
59
+ attr. tokens
60
+ . clone ( )
61
+ . into_iter ( )
62
+ . next ( )
63
+ . map ( |token_tree| check_for_attr ( token_tree, "tag" ) )
64
+ . unwrap ( )
65
+ } ) ;
66
+
67
+ WriteableField {
68
+ ident,
69
+ is_tag,
70
+ is_ignore,
71
+ }
24
72
}
25
73
}
26
74
27
75
pub fn expand_writeable ( tokens : TokenStream ) -> TokenStream {
28
76
let krate = super :: krate ( ) ;
29
77
30
- let input = parse_macro_input ! ( tokens as ItemStruct ) ;
78
+ let tokens_cloned = tokens. clone ( ) ;
79
+ let input = parse_macro_input ! ( tokens_cloned as ItemStruct ) ;
31
80
let ident = input. ident ;
32
81
let generics = input. generics ;
33
82
@@ -38,6 +87,7 @@ pub fn expand_writeable(tokens: TokenStream) -> TokenStream {
38
87
. named
39
88
. into_iter ( )
40
89
. map ( WriteableField :: from)
90
+ . filter ( |field| !field. is_ignore )
41
91
. filter ( |field| field. ident . to_string ( ) != time_field. to_string ( ) )
42
92
. map ( |field| {
43
93
let ident = field. ident ;
0 commit comments