diff options
Diffstat (limited to 'crates/core/thin_edge_json/src/serialize.rs')
-rw-r--r-- | crates/core/thin_edge_json/src/serialize.rs | 52 |
1 files changed, 39 insertions, 13 deletions
diff --git a/crates/core/thin_edge_json/src/serialize.rs b/crates/core/thin_edge_json/src/serialize.rs index 3823776b..0c307ec0 100644 --- a/crates/core/thin_edge_json/src/serialize.rs +++ b/crates/core/thin_edge_json/src/serialize.rs @@ -1,12 +1,11 @@ use crate::measurement::MeasurementVisitor; -use chrono::offset::FixedOffset; -use chrono::DateTime; use json_writer::{JsonWriter, JsonWriterError}; +use time::{format_description, OffsetDateTime}; pub struct ThinEdgeJsonSerializer { json: JsonWriter, is_within_group: bool, - default_timestamp: Option<DateTime<FixedOffset>>, + default_timestamp: Option<OffsetDateTime>, timestamp_present: bool, } @@ -16,6 +15,9 @@ pub enum ThinEdgeJsonSerializationError { FormatError(#[from] std::fmt::Error), #[error(transparent)] + FromTimeFormatError(#[from] time::error::Format), + + #[error(transparent)] MeasurementCollectorError(#[from] MeasurementStreamError), #[error("Serializer produced invalid Utf8 string")] @@ -45,7 +47,7 @@ impl ThinEdgeJsonSerializer { Self::new_with_timestamp(None) } - pub fn new_with_timestamp(default_timestamp: Option<DateTime<FixedOffset>>) -> Self { + pub fn new_with_timestamp(default_timestamp: Option<OffsetDateTime>) -> Self { let capa = 1024; // XXX: Choose a capacity based on expected JSON length. let mut json = JsonWriter::with_capacity(capa); json.write_open_obj(); @@ -92,13 +94,17 @@ impl Default for ThinEdgeJsonSerializer { impl MeasurementVisitor for ThinEdgeJsonSerializer { type Error = ThinEdgeJsonSerializationError; - fn visit_timestamp(&mut self, timestamp: DateTime<FixedOffset>) -> Result<(), Self::Error> { + fn visit_timestamp(&mut self, timestamp: OffsetDateTime) -> Result<(), Self::Error> { if self.is_within_group { return Err(MeasurementStreamError::UnexpectedTimestamp.into()); } self.json.write_key("time")?; - self.json.write_str(timestamp.to_rfc3339().as_str())?; + self.json.write_str( + timestamp + .format(&format_description::well_known::Rfc3339)? + .as_str(), + )?; self.timestamp_present = true; Ok(()) } @@ -134,10 +140,9 @@ impl MeasurementVisitor for ThinEdgeJsonSerializer { #[cfg(test)] mod tests { use super::*; - use chrono::{offset::FixedOffset, DateTime, Local}; - fn test_timestamp() -> DateTime<FixedOffset> { - let local_time_now: DateTime<Local> = Local::now(); - local_time_now.with_timezone(local_time_now.offset()) + + fn test_timestamp() -> OffsetDateTime { + OffsetDateTime::now_utc() } #[test] @@ -149,7 +154,14 @@ mod tests { serializer.visit_measurement("temperature", 25.5)?; let body = r#""temperature":25.5"#; - let expected_output = format!(r#"{{"time":"{}",{}}}"#, timestamp.to_rfc3339(), body); + let expected_output = format!( + r#"{{"time":"{}",{}}}"#, + timestamp + .format(&format_description::well_known::Rfc3339) + .unwrap() + .as_str(), + body + ); let output = serializer.into_string()?; assert_eq!(output, expected_output); Ok(()) @@ -178,7 +190,14 @@ mod tests { serializer.visit_end_group()?; serializer.visit_measurement("pressure", 255.0)?; let body = r#""temperature":25.5,"location":{"alti":2100.4,"longi":2200.4,"lati":2300.4},"pressure":255.0}"#; - let expected_output = format!(r#"{{"time":"{}",{}"#, timestamp.to_rfc3339(), body); + let expected_output = format!( + r#"{{"time":"{}",{}"#, + timestamp + .format(&format_description::well_known::Rfc3339) + .unwrap() + .as_str(), + body + ); let output = serializer.into_string()?; assert_eq!(expected_output, output); Ok(()) @@ -198,7 +217,14 @@ mod tests { let mut serializer = ThinEdgeJsonSerializer::new(); let timestamp = test_timestamp(); serializer.visit_timestamp(timestamp)?; - let expected_output = format!(r#"{{"time":"{}"{}"#, timestamp.to_rfc3339(), "}"); + let expected_output = format!( + r#"{{"time":"{}"{}"#, + timestamp + .format(&format_description::well_known::Rfc3339) + .unwrap() + .as_str(), + "}" + ); let output = serializer.into_string()?; assert_eq!(expected_output, output); Ok(()) |