#[macro_export]
macro_rules! point {
($measure:expr, $(($fname:expr, $fval:expr)) + $(; $ts:expr)?) => {
{
let mut fields: Vec<(String, Box<dyn $crate::IntoFieldData>)> = Vec::new();
$(
fields.push((String::from($fname), Box::new($fval)));
)*
#[allow(unused_mut)]
let mut timestamp: Option<u64> = None;
$(
timestamp = timestamp.or(Some($ts));
)?
$crate::Point::new(
String::from($measure),
Vec::new(),
fields,
timestamp,
)
}
};
($measure:expr, $(($tname:expr, $tval:expr)) +, $(($fname:expr, $fval:expr)) + $(; $ts:expr)?) => {
{
let mut tags: Vec<(String, String)> = Vec::new();
let mut fields: Vec<(String, Box<dyn $crate::IntoFieldData>)> = Vec::new();
$(
tags.push((String::from($tname), format!("{}", $tval)));
)*
$(
fields.push((String::from($fname), Box::new($fval)));
)*
#[allow(unused_mut)]
let mut timestamp: Option<u64> = None;
$(
timestamp = timestamp.or(Some($ts));
)?
$crate::Point::new(
String::from($measure),
tags,
fields,
timestamp,
)
}
};
}
#[cfg(test)]
mod tests {
use crate::*;
#[test]
fn can_create_with_ts() {
let p = point!("test", ("t", "v")("t2", "v2"), ("f", "v"); 10);
let exp = Point::new(
"test".to_string(),
vec![
("t".to_string(), "v".to_string()),
("t2".to_string(), "v2".to_string()),
],
vec![("f".to_string(), Box::new("v"))],
Some(10),
);
assert_eq!(p, exp);
}
#[test]
fn can_create_with_tag() {
let p = point!("test", ("t", "v")("t2", "v2"), ("f", "v"));
let exp = Point::new(
"test".to_string(),
vec![
("t".to_string(), "v".to_string()),
("t2".to_string(), "v2".to_string()),
],
vec![("f".to_string(), Box::new("v"))],
None,
);
assert_eq!(p, exp);
}
#[test]
fn can_create_whtout_tag() {
let p = point!("test", ("f", "v"));
let exp = Point::new(
"test".to_string(),
Vec::new(),
vec![("f".to_string(), Box::new("v"))],
None,
);
assert_eq!(p, exp);
}
}