From f06c74c85ccc5c5941f87c4c834547bdd96e2bbb Mon Sep 17 00:00:00 2001 From: Natty Date: Wed, 10 Jan 2024 03:09:14 +0100 Subject: [PATCH] Serialize time as a millis epoch timestamp in cursors --- magnetar_sdk/src/types/mod.rs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/magnetar_sdk/src/types/mod.rs b/magnetar_sdk/src/types/mod.rs index 4763232..ad46425 100644 --- a/magnetar_sdk/src/types/mod.rs +++ b/magnetar_sdk/src/types/mod.rs @@ -5,17 +5,46 @@ pub mod note; pub mod timeline; pub mod user; -use crate::endpoints::ErrorKind; use crate::util_types::U64Range; use chrono::{DateTime, Utc}; use serde::de::Error; use serde::{Deserialize, Deserializer, Serialize}; use ts_rs::TS; +pub(crate) mod packed_time { + use chrono::{DateTime, NaiveDateTime, Utc}; + use serde::de::Error; + use serde::{Deserialize, Deserializer, Serializer}; + + pub(crate) fn serialize(value: &DateTime, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&value.timestamp_millis().to_string()) + } + + pub(crate) fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + Ok(DateTime::::from_utc( + NaiveDateTime::from_timestamp_millis( + String::deserialize(deserializer)? + .parse::() + .map_err(Error::custom)?, + ) + .ok_or_else(|| Error::custom("millisecond value out of range"))?, + Utc, + )) + } +} + #[derive(Clone, Debug, Deserialize, Serialize, TS)] #[ts(export)] pub struct RangeFilter { + #[serde(with = "packed_time")] pub time_start: DateTime, + #[serde(with = "packed_time")] pub time_end: DateTime, pub id_start: String, pub id_end: String, @@ -24,6 +53,7 @@ pub struct RangeFilter { #[derive(Clone, Debug, Deserialize, Serialize, TS)] #[ts(export)] pub struct StartFilter { + #[serde(with = "packed_time")] pub time_start: DateTime, pub id_start: String, } @@ -31,6 +61,7 @@ pub struct StartFilter { #[derive(Clone, Debug, Deserialize, Serialize, TS)] #[ts(export)] pub struct EndFilter { + #[serde(with = "packed_time")] pub time_end: DateTime, pub id_end: String, }