Skip to content

Commit d499e64

Browse files
authored
RUST-1540 impl i64_as_datetime (#383)
1 parent 8952194 commit d499e64

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

src/serde_helpers.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ pub use hex_string_as_object_id::{
2323
serialize as serialize_hex_string_as_object_id,
2424
};
2525
#[doc(inline)]
26+
pub use i64_as_datetime::{
27+
deserialize as deserialize_i64_from_datetime,
28+
serialize as serialize_i64_as_datetime,
29+
};
30+
#[doc(inline)]
2631
pub use rfc3339_string_as_bson_datetime::{
2732
deserialize as deserialize_rfc3339_string_from_bson_datetime,
2833
serialize as serialize_rfc3339_string_as_bson_datetime,
@@ -412,6 +417,40 @@ pub mod hex_string_as_object_id {
412417
}
413418
}
414419

420+
/// Contains functions to `serialize` a `i64` integer as `DateTime` and `deserialize`
421+
/// a `i64` integer from `DateTime`
422+
///
423+
/// ### The i64 should represent seconds `(DateTime::timestamp_millis(..))`.
424+
///
425+
/// ```rust
426+
/// # use serde::{Serialize, Deserialize};
427+
/// # use bson::serde_helpers::i64_as_datetime;
428+
/// #[derive(Serialize, Deserialize)]
429+
/// struct Item {
430+
/// #[serde(with = "i64_as_datetime")]
431+
/// pub now: i64,
432+
/// }
433+
/// ```
434+
pub mod i64_as_datetime {
435+
use crate::DateTime;
436+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
437+
438+
/// Deserializes a i64 integer from a DateTime.
439+
pub fn deserialize<'de, D>(deserializer: D) -> Result<i64, D::Error>
440+
where
441+
D: Deserializer<'de>,
442+
{
443+
let date: DateTime = DateTime::deserialize(deserializer)?;
444+
Ok(date.timestamp_millis())
445+
}
446+
447+
/// Serializes a i64 integer as a DateTime.
448+
pub fn serialize<S: Serializer>(val: &i64, serializer: S) -> Result<S::Ok, S::Error> {
449+
let date_time = DateTime::from_millis(*val);
450+
date_time.serialize(serializer)
451+
}
452+
}
453+
415454
#[allow(unused_macros)]
416455
macro_rules! as_binary_mod {
417456
($feat:meta, $uu:path) => {

src/tests/serde.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::{
1010
serde_helpers::{
1111
bson_datetime_as_rfc3339_string,
1212
hex_string_as_object_id,
13+
i64_as_datetime,
1314
rfc3339_string_as_bson_datetime,
1415
serialize_object_id_as_hex_string,
1516
timestamp_as_u32,
@@ -886,6 +887,26 @@ fn test_oid_helpers() {
886887
assert_eq!(a.oid, oid.to_string());
887888
}
888889

890+
#[test]
891+
fn test_i64_as_datetime() {
892+
let _guard = LOCK.run_concurrently();
893+
894+
#[derive(Serialize, Deserialize)]
895+
struct A {
896+
#[serde(with = "i64_as_datetime")]
897+
now: i64,
898+
}
899+
900+
let now = DateTime::now();
901+
let a = A {
902+
now: now.timestamp_millis(),
903+
};
904+
let doc = to_document(&a).unwrap();
905+
assert_eq!(doc.get_datetime("now").unwrap(), &now);
906+
let a: A = from_document(doc).unwrap();
907+
assert_eq!(a.now, now.timestamp_millis());
908+
}
909+
889910
#[test]
890911
#[cfg(feature = "uuid-0_8")]
891912
fn test_uuid_0_8_helpers() {

0 commit comments

Comments
 (0)