Skip to content

Commit 0d31401

Browse files
authored
RUST-747 Add serde helper to deserialize hex string from ObjectId (#248)
1 parent 320c783 commit 0d31401

File tree

2 files changed

+49
-26
lines changed

2 files changed

+49
-26
lines changed

src/serde_helpers.rs

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
33
use std::{convert::TryFrom, result::Result};
44

5-
use serde::{ser, Serialize, Serializer};
6-
7-
use crate::oid::ObjectId;
5+
use serde::{ser, Serializer};
86

97
pub use bson_datetime_as_iso_string::{
108
deserialize as deserialize_bson_datetime_from_iso_string,
@@ -14,21 +12,22 @@ pub use chrono_datetime_as_bson_datetime::{
1412
deserialize as deserialize_chrono_datetime_from_bson_datetime,
1513
serialize as serialize_chrono_datetime_as_bson_datetime,
1614
};
15+
pub use hex_string_as_object_id::{
16+
deserialize as deserialize_hex_string_from_object_id,
17+
serialize as serialize_hex_string_as_object_id,
18+
};
1719
pub use iso_string_as_bson_datetime::{
1820
deserialize as deserialize_iso_string_from_bson_datetime,
1921
serialize as serialize_iso_string_as_bson_datetime,
2022
};
2123
pub use timestamp_as_u32::{
22-
deserialize as deserialize_timestamp_from_u32,
23-
serialize as serialize_timestamp_as_u32,
24+
deserialize as deserialize_timestamp_from_u32, serialize as serialize_timestamp_as_u32,
2425
};
2526
pub use u32_as_timestamp::{
26-
deserialize as deserialize_u32_from_timestamp,
27-
serialize as serialize_u32_as_timestamp,
27+
deserialize as deserialize_u32_from_timestamp, serialize as serialize_u32_as_timestamp,
2828
};
2929
pub use uuid_as_binary::{
30-
deserialize as deserialize_uuid_from_binary,
31-
serialize as serialize_uuid_as_binary,
30+
deserialize as deserialize_uuid_from_binary, serialize as serialize_uuid_as_binary,
3231
};
3332

3433
/// Attempts to serialize a u32 as an i32. Errors if an exact conversion is not possible.
@@ -167,17 +166,40 @@ pub mod bson_datetime_as_iso_string {
167166
}
168167
}
169168

170-
/// Serializes a hex string as an ObjectId.
171-
pub fn serialize_hex_string_as_object_id<S: Serializer>(
172-
val: &str,
173-
serializer: S,
174-
) -> Result<S::Ok, S::Error> {
175-
match ObjectId::with_string(val) {
176-
Ok(oid) => oid.serialize(serializer),
177-
Err(_) => Err(ser::Error::custom(format!(
178-
"cannot convert {} to ObjectId",
179-
val
180-
))),
169+
/// Contains functions to serialize a hex string as an ObjectId and deserialize a
170+
/// hex string from an ObjectId
171+
///
172+
/// ```rust
173+
/// # use serde::{Serialize, Deserialize};
174+
/// # use bson::serde_helpers::hex_string_as_object_id;
175+
/// #[derive(Serialize, Deserialize)]
176+
/// struct Item {
177+
/// #[serde(with = "hex_string_as_object_id")]
178+
/// pub id: String,
179+
/// }
180+
/// ```
181+
pub mod hex_string_as_object_id {
182+
use crate::oid::ObjectId;
183+
use serde::{ser, Deserialize, Deserializer, Serialize, Serializer};
184+
185+
/// Deserializes a hex string from an ObjectId.
186+
pub fn deserialize<'de, D>(deserializer: D) -> Result<String, D::Error>
187+
where
188+
D: Deserializer<'de>,
189+
{
190+
let object_id = ObjectId::deserialize(deserializer)?;
191+
Ok(object_id.to_hex())
192+
}
193+
194+
/// Serializes a hex string as an ObjectId.
195+
pub fn serialize<S: Serializer>(val: &str, serializer: S) -> Result<S::Ok, S::Error> {
196+
match ObjectId::with_string(val) {
197+
Ok(oid) => oid.serialize(serializer),
198+
Err(_) => Err(ser::Error::custom(format!(
199+
"cannot convert {} to ObjectId",
200+
val
201+
))),
202+
}
181203
}
182204
}
183205

src/tests/serde.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::{
99
oid::ObjectId,
1010
serde_helpers,
1111
serde_helpers::{
12+
hex_string_as_object_id,
1213
bson_datetime_as_iso_string,
1314
chrono_datetime_as_bson_datetime,
1415
iso_string_as_bson_datetime,
@@ -727,18 +728,18 @@ fn test_datetime_helpers() {
727728
fn test_oid_helpers() {
728729
let _guard = LOCK.run_concurrently();
729730

730-
#[derive(Serialize)]
731+
#[derive(Serialize, Deserialize)]
731732
struct A {
732-
#[serde(serialize_with = "serde_helpers::serialize_hex_string_as_object_id")]
733+
#[serde(with = "hex_string_as_object_id")]
733734
oid: String,
734735
}
735736

736737
let oid = ObjectId::new();
737-
let a = A {
738-
oid: oid.to_string(),
739-
};
738+
let a = A { oid: oid.to_string() };
740739
let doc = to_document(&a).unwrap();
741-
assert_eq!(doc.get_object_id("oid").unwrap(), oid);
740+
assert_eq!(doc.get_object_id("oid").unwrap(), oid);
741+
let a: A = from_document(doc).unwrap();
742+
assert_eq!(a.oid, oid.to_string());
742743
}
743744

744745
#[test]

0 commit comments

Comments
 (0)