22
33use std:: { convert:: TryFrom , result:: Result } ;
44
5- use serde:: { ser, Serialize , Serializer } ;
6-
7- use crate :: oid:: ObjectId ;
5+ use serde:: { ser, Serializer } ;
86
97pub 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+ } ;
1719pub 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} ;
2123pub 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} ;
2526pub 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} ;
2929pub 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
0 commit comments