From 0d4dccc269e5d91fe56a0daa56b4618de8664963 Mon Sep 17 00:00:00 2001 From: Blas Rodriguez Irizar Date: Tue, 15 Dec 2020 00:00:20 +0100 Subject: [PATCH] influxdb-derive: add #[ignored] attribute This attribute signales influx to avoid inserting a field --- influxdb/tests/derive_integration_tests.rs | 15 ++++++++++++++- influxdb_derive/src/lib.rs | 2 +- influxdb_derive/src/writeable.rs | 18 +++++++++++++++++- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/influxdb/tests/derive_integration_tests.rs b/influxdb/tests/derive_integration_tests.rs index 9c136b28..d8bf015b 100644 --- a/influxdb/tests/derive_integration_tests.rs +++ b/influxdb/tests/derive_integration_tests.rs @@ -22,6 +22,18 @@ struct WeatherReading { wind_strength: Option, } +#[derive(Debug, PartialEq)] +#[cfg_attr(feature = "derive", derive(InfluxDbWriteable))] +#[cfg_attr(feature = "use-serde", derive(Deserialize))] +struct WeatherReadingIgnoredField { + time: DateTime, + humidity: i32, + #[tag] + wind_strength: Option, + #[ignored] + temperature: u64, +} + #[test] fn test_build_query() { let weather_reading = WeatherReading { @@ -80,10 +92,11 @@ async fn test_write_and_read_option() { || async move { create_db(TEST_NAME).await.expect("could not setup db"); let client = create_client(TEST_NAME); - let weather_reading = WeatherReading { + let weather_reading = WeatherReadingIgnoredField { time: Timestamp::Hours(11).into(), humidity: 30, wind_strength: None, + temperature: 11, }; let write_result = client .query(&weather_reading.into_query("weather_reading".to_string())) diff --git a/influxdb_derive/src/lib.rs b/influxdb_derive/src/lib.rs index 6c4b02dd..97a1ce72 100644 --- a/influxdb_derive/src/lib.rs +++ b/influxdb_derive/src/lib.rs @@ -9,7 +9,7 @@ fn krate() -> TokenStream2 { quote!(::influxdb) } -#[proc_macro_derive(InfluxDbWriteable, attributes(tag))] +#[proc_macro_derive(InfluxDbWriteable, attributes(tag, ignored))] pub fn derive_writeable(tokens: TokenStream) -> TokenStream { expand_writeable(tokens) } diff --git a/influxdb_derive/src/writeable.rs b/influxdb_derive/src/writeable.rs index f42c3330..ee563bb6 100644 --- a/influxdb_derive/src/writeable.rs +++ b/influxdb_derive/src/writeable.rs @@ -6,11 +6,21 @@ use syn::{parse_macro_input, Field, Fields, Ident, ItemStruct}; struct WriteableField { ident: Ident, is_tag: bool, + is_ignored: bool, } impl From for WriteableField { fn from(field: Field) -> WriteableField { let ident = field.ident.expect("fields without ident are not supported"); + let is_ignored = field.attrs.iter().any(|attr| { + attr.path + .segments + .iter() + .last() + .map(|seg| seg.ident.to_string()) + .unwrap_or_default() + == "ignored" + }); let is_tag = field.attrs.iter().any(|attr| { attr.path .segments @@ -20,7 +30,12 @@ impl From for WriteableField { .unwrap_or_default() == "tag" }); - WriteableField { ident, is_tag } + + WriteableField { + ident, + is_tag, + is_ignored, + } } } @@ -38,6 +53,7 @@ pub fn expand_writeable(tokens: TokenStream) -> TokenStream { .named .into_iter() .map(WriteableField::from) + .filter(|field| !field.is_ignored) .filter(|field| field.ident.to_string() != time_field.to_string()) .map(|field| { let ident = field.ident;