macro_rules! create_datapoint {
    (@field $point:ident $name:expr, $string:expr, String) => { ... };
    (@field $point:ident $name:expr, $value:expr, i64) => { ... };
    (@field $point:ident $name:expr, $value:expr, f64) => { ... };
    (@field $point:ident $name:expr, $value:expr, bool) => { ... };
    (@tag $point:ident $tag_name:expr, $tag_value:expr) => { ... };
    (@fields $point:ident) => { ... };
    (@fields $point:ident $tag_name:expr => $tag_value:expr, $($rest:tt)*) => { ... };
    (@fields $point:ident $tag_name:expr => $tag_value:expr) => { ... };
    (@fields $point:ident ($name:expr, $value:expr, $type:ident) , $($rest:tt)*) => { ... };
    (@fields $point:ident ($name:expr, $value:expr, $type:ident)) => { ... };
    (@point $name:expr, $($fields:tt)+) => { ... };
    (@point $name:expr) => { ... };
}