Skip to content

Commit 9fec03e

Browse files
committed
first failed attempt to implement #[influx_aware()]
1 parent 5ed1347 commit 9fec03e

File tree

3 files changed

+58
-7
lines changed

3 files changed

+58
-7
lines changed

influxdb/tests/derive_integration_tests.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ use utilities::{assert_result_ok, create_client, create_db, delete_db, run_test}
1717
#[cfg_attr(feature = "use-serde", derive(Deserialize))]
1818
struct WeatherReading {
1919
time: DateTime<Utc>,
20+
#[influx_aware(ignore)]
2021
humidity: i32,
21-
#[tag]
22+
#[influx_aware(tag)]
2223
wind_strength: Option<u64>,
2324
}
2425

influxdb_derive/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ fn krate() -> TokenStream2 {
99
quote!(::influxdb)
1010
}
1111

12-
#[proc_macro_derive(InfluxDbWriteable, attributes(tag))]
12+
#[proc_macro_derive(InfluxDbWriteable, attributes(tag, influx_aware))]
1313
pub fn derive_writeable(tokens: TokenStream) -> TokenStream {
1414
expand_writeable(tokens)
1515
}

influxdb_derive/src/writeable.rs

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,82 @@
11
use proc_macro::TokenStream;
2-
use proc_macro2::TokenStream as TokenStream2;
2+
use proc_macro2::{TokenStream as TokenStream2, TokenTree as TokenTree2};
33
use quote::{format_ident, quote};
44
use syn::{parse_macro_input, Field, Fields, Ident, ItemStruct};
55

6+
#[derive(Debug)]
67
struct WriteableField {
78
ident: Ident,
89
is_tag: bool,
10+
is_ignore: bool,
911
}
1012

1113
impl From<Field> for WriteableField {
1214
fn from(field: Field) -> WriteableField {
1315
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 {
1518
attr.path
1619
.segments
1720
.iter()
1821
.last()
1922
.map(|seg| seg.ident.to_string())
2023
.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()
2253
});
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+
}
2472
}
2573
}
2674

2775
pub fn expand_writeable(tokens: TokenStream) -> TokenStream {
2876
let krate = super::krate();
2977

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);
3180
let ident = input.ident;
3281
let generics = input.generics;
3382

@@ -38,6 +87,7 @@ pub fn expand_writeable(tokens: TokenStream) -> TokenStream {
3887
.named
3988
.into_iter()
4089
.map(WriteableField::from)
90+
.filter(|field| !field.is_ignore)
4191
.filter(|field| field.ident.to_string() != time_field.to_string())
4292
.map(|field| {
4393
let ident = field.ident;

0 commit comments

Comments
 (0)