use ::chrono::{DateTime, Utc};
use super::FieldName;
use super::FieldValue;
use super::Line;
use super::Measurement;
use super::TagName;
use super::TagValue;
#[derive(Clone, Debug, PartialEq)]
pub struct LineBuilder {
line: Line,
}
impl LineBuilder {
pub fn new(measurement: impl Into<Measurement>) -> Self {
Self {
line: Line::new(measurement),
}
}
pub fn insert_field(self, name: impl Into<FieldName>, value: impl Into<FieldValue>) -> Self {
let mut line = self.line;
line.insert_field(name, value);
Self { line }
}
pub fn insert_tag(self, name: impl Into<TagName>, value: impl Into<TagValue>) -> Self {
let mut line = self.line;
line.insert_tag(name, value);
Self { line }
}
pub fn set_timestamp(self, timestamp: DateTime<Utc>) -> Self {
let mut line = self.line;
line.set_timestamp(timestamp);
Self { line }
}
pub fn build(self) -> Line {
self.line
}
}
#[cfg(test)]
mod tests {
use super::*;
use chrono::TimeZone;
#[test]
fn create_record() {
let actual = LineBuilder::new("location")
.insert_tag("city", "Odense")
.insert_field("latitude", FieldValue::Float(55.383333))
.insert_field("longitude", FieldValue::Float(10.383333))
.set_timestamp(Utc.ymd(2014, 7, 8).and_hms(9, 10, 11))
.build();
let mut expected = Line::new("location");
expected.insert_tag("city", "Odense");
expected.insert_field("latitude", FieldValue::Float(55.383333));
expected.insert_field("longitude", FieldValue::Float(10.383333));
expected.set_timestamp(Utc.ymd(2014, 7, 8).and_hms(9, 10, 11));
assert_eq!(actual, expected);
}
}