Skip to content

Commit 39be458

Browse files
saghmkyeah
authored andcommitted
add TimeStamp type to facilitate deserialization (#88)
1 parent 4b4cc67 commit 39be458

File tree

4 files changed

+60
-2
lines changed

4 files changed

+60
-2
lines changed

src/bson.rs

+21
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,27 @@ impl Bson {
595595
}
596596
}
597597

598+
/// `TimeStamp` representation in struct for serde serialization
599+
///
600+
/// Just a helper for convenience
601+
///
602+
/// ```rust,ignore
603+
/// #[macro_use]
604+
/// extern crate serde_derive;
605+
/// extern crate bson;
606+
/// use bson::TimeStamp;
607+
///
608+
/// #[derive(Serialize, Deserialize)]
609+
/// struct Foo {
610+
/// timestamp: TimeStamp,
611+
/// }
612+
/// ```
613+
#[derive(Debug, Eq, PartialEq, Clone)]
614+
pub struct TimeStamp {
615+
pub t: u32,
616+
pub i: u32,
617+
}
618+
598619
/// `DateTime` representation in struct for serde serialization
599620
///
600621
/// Just a helper for convenience

src/decoder/serde.rs

+22-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use serde::de::{self, Deserialize, Deserializer, Visitor, MapAccess, SeqAccess,
55
DeserializeSeed, EnumAccess};
66
use serde::de::{Error, Unexpected};
77

8-
use bson::{Bson, UtcDateTime};
8+
use bson::{Bson, TimeStamp, UtcDateTime};
99
use oid::ObjectId;
1010
use ordered::{OrderedDocument, OrderedDocumentIntoIterator, OrderedDocumentVisitor};
1111
use super::error::{DecoderError, DecoderResult};
@@ -601,6 +601,26 @@ impl<'de> Deserializer<'de> for MapDecoder {
601601
}
602602
}
603603

604+
impl<'de> Deserialize<'de> for TimeStamp {
605+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
606+
where D: Deserializer<'de>
607+
{
608+
use serde::de::Error;
609+
610+
match Bson::deserialize(deserializer)? {
611+
Bson::TimeStamp(ts) => {
612+
let ts = ts.to_be();
613+
614+
Ok(TimeStamp {
615+
t: ((ts as u64) >> 32) as u32,
616+
i: (ts & 0xFFFF_FFFF) as u32,
617+
})
618+
}
619+
_ => Err(D::Error::custom("expecting UtcDateTime")),
620+
}
621+
}
622+
}
623+
604624
impl<'de> Deserialize<'de> for UtcDateTime {
605625
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
606626
where D: Deserializer<'de>
@@ -613,3 +633,4 @@ impl<'de> Deserialize<'de> for UtcDateTime {
613633
}
614634
}
615635
}
636+

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ extern crate linked_hash_map;
5555
extern crate hostname;
5656
extern crate hex;
5757

58-
pub use self::bson::{Bson, Document, Array, UtcDateTime};
58+
pub use self::bson::{Bson, Document, Array, TimeStamp, UtcDateTime};
5959
pub use self::encoder::{encode_document, to_bson, Encoder, EncoderResult, EncoderError};
6060
pub use self::decoder::{decode_document, decode_document_utf8_lossy, from_bson, Decoder, DecoderResult, DecoderError};
6161
pub use self::ordered::{ValueAccessError, ValueAccessResult};

tests/serde.rs

+16
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,22 @@ fn test_de_map() {
5858
assert_eq!(expected, map);
5959
}
6060

61+
#[test]
62+
fn test_de_timestamp() {
63+
use bson::TimeStamp;
64+
65+
#[derive(Deserialize, Eq, PartialEq, Debug)]
66+
struct Foo {
67+
ts: TimeStamp,
68+
}
69+
70+
let foo: Foo = bson::from_bson(Bson::Document(doc! {
71+
"ts": Bson::TimeStamp(0x0A00_0000_0C00_0000),
72+
})).unwrap();
73+
74+
assert_eq!(foo.ts, TimeStamp { t: 12, i: 10 });
75+
}
76+
6177
#[test]
6278
fn test_ser_datetime() {
6379
use chrono::{Utc, Timelike};

0 commit comments

Comments
 (0)