From 36c48b74d24ba65f4689f758d257a5125bdbf4ce Mon Sep 17 00:00:00 2001 From: borngraced Date: Tue, 8 Nov 2022 20:16:09 +0100 Subject: [PATCH 1/4] impl i64_as_datetime --- src/serde_helpers.rs | 40 ++++++++++++++++++++++++++++++++++++++++ src/tests/serde.rs | 21 +++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/serde_helpers.rs b/src/serde_helpers.rs index b015c3ea..8ba27342 100644 --- a/src/serde_helpers.rs +++ b/src/serde_helpers.rs @@ -23,6 +23,11 @@ pub use hex_string_as_object_id::{ serialize as serialize_hex_string_as_object_id, }; #[doc(inline)] +pub use i64_as_datetime::{ + deserialize as deserialize_i64_from_datetime, + serialize as serialize_i64_as_datetime, +}; +#[doc(inline)] pub use rfc3339_string_as_bson_datetime::{ deserialize as deserialize_rfc3339_string_from_bson_datetime, serialize as serialize_rfc3339_string_as_bson_datetime, @@ -412,6 +417,41 @@ pub mod hex_string_as_object_id { } } +/// Contains functions to `serialize` a `i64` integer as `DateTime` and `deserialize` +/// a `i64` integer from `DateTime` +/// +/// ### The i64 should represent seconds `(DateTime::timestamp_millis(..))`. +/// +/// ```rust +/// # use serde::{Serialize, Deserialize}; +/// # use bson::serde_helpers::i64_as_datetime; +/// #[derive(Serialize, Deserialize)] +/// struct Item { +/// #[serde(with = "i64_as_datetime")] +/// pub created_at: i64, +/// } +/// ``` + +pub mod i64_as_datetime { + use crate::DateTime; + use serde::{Deserialize, Deserializer, Serialize, Serializer}; + + /// Deserializes a hex string from an ObjectId. + pub fn deserialize<'de, D>(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let date: DateTime = DateTime::deserialize(deserializer)?; + Ok(date.timestamp_millis()) + } + + /// Serializes a hex string as an ObjectId. + pub fn serialize(val: &i64, serializer: S) -> Result { + let date_time = DateTime::from_millis(*val); + date_time.serialize(serializer) + } +} + #[allow(unused_macros)] macro_rules! as_binary_mod { ($feat:meta, $uu:path) => { diff --git a/src/tests/serde.rs b/src/tests/serde.rs index 362587a8..0718c2e9 100644 --- a/src/tests/serde.rs +++ b/src/tests/serde.rs @@ -10,6 +10,7 @@ use crate::{ serde_helpers::{ bson_datetime_as_rfc3339_string, hex_string_as_object_id, + i64_as_datetime, rfc3339_string_as_bson_datetime, serialize_object_id_as_hex_string, timestamp_as_u32, @@ -886,6 +887,26 @@ fn test_oid_helpers() { assert_eq!(a.oid, oid.to_string()); } +#[test] +fn test_i64_as_datetime() { + let _guard = LOCK.run_concurrently(); + + #[derive(Serialize, Deserialize)] + struct A { + #[serde(with = "i64_as_datetime")] + now: i64, + } + + let now = DateTime::now(); + let a = A { + now: now.timestamp_millis(), + }; + let doc = to_document(&a).unwrap(); + assert_eq!(doc.get_datetime("now").unwrap(), &now); + let a: A = from_document(doc).unwrap(); + assert_eq!(a.now, now.timestamp_millis()); +} + #[test] #[cfg(feature = "uuid-0_8")] fn test_uuid_0_8_helpers() { From 6b86625d6d8d888b0b80fc7e4b6d6b96865c9e4c Mon Sep 17 00:00:00 2001 From: borngraced Date: Tue, 8 Nov 2022 20:18:52 +0100 Subject: [PATCH 2/4] rm whitespace --- src/serde_helpers.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/serde_helpers.rs b/src/serde_helpers.rs index 8ba27342..4a056b49 100644 --- a/src/serde_helpers.rs +++ b/src/serde_helpers.rs @@ -431,7 +431,6 @@ pub mod hex_string_as_object_id { /// pub created_at: i64, /// } /// ``` - pub mod i64_as_datetime { use crate::DateTime; use serde::{Deserialize, Deserializer, Serialize, Serializer}; From b8a59cd0f532ec2846424754a475200aae1ae6f4 Mon Sep 17 00:00:00 2001 From: borngraced Date: Wed, 9 Nov 2022 01:57:17 +0100 Subject: [PATCH 3/4] fix doc --- src/serde_helpers.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/serde_helpers.rs b/src/serde_helpers.rs index 4a056b49..456201e1 100644 --- a/src/serde_helpers.rs +++ b/src/serde_helpers.rs @@ -435,7 +435,7 @@ pub mod i64_as_datetime { use crate::DateTime; use serde::{Deserialize, Deserializer, Serialize, Serializer}; - /// Deserializes a hex string from an ObjectId. + /// Deserializes a i64 integer from an DateTime. pub fn deserialize<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, @@ -444,7 +444,7 @@ pub mod i64_as_datetime { Ok(date.timestamp_millis()) } - /// Serializes a hex string as an ObjectId. + /// Serializes a i64 integer as a DateTime. pub fn serialize(val: &i64, serializer: S) -> Result { let date_time = DateTime::from_millis(*val); date_time.serialize(serializer) From 5b0e1c5aad56c49eb66b90a2d92696392f42e1bd Mon Sep 17 00:00:00 2001 From: borngraced Date: Wed, 9 Nov 2022 01:58:08 +0100 Subject: [PATCH 4/4] fix doc --- src/serde_helpers.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/serde_helpers.rs b/src/serde_helpers.rs index 456201e1..e836d1c0 100644 --- a/src/serde_helpers.rs +++ b/src/serde_helpers.rs @@ -428,14 +428,14 @@ pub mod hex_string_as_object_id { /// #[derive(Serialize, Deserialize)] /// struct Item { /// #[serde(with = "i64_as_datetime")] -/// pub created_at: i64, +/// pub now: i64, /// } /// ``` pub mod i64_as_datetime { use crate::DateTime; use serde::{Deserialize, Deserializer, Serialize, Serializer}; - /// Deserializes a i64 integer from an DateTime. + /// Deserializes a i64 integer from a DateTime. pub fn deserialize<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>,