summaryrefslogtreecommitdiffstats
path: root/crates/core/thin_edge_json/src/serialize.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/core/thin_edge_json/src/serialize.rs')
-rw-r--r--crates/core/thin_edge_json/src/serialize.rs52
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(())