@@ -17,6 +17,12 @@ pub use chrono_datetime_as_bson_datetime::{
17
17
deserialize as deserialize_chrono_datetime_from_bson_datetime,
18
18
serialize as serialize_chrono_datetime_as_bson_datetime,
19
19
} ;
20
+ #[ cfg( feature = "chrono-0_4" ) ]
21
+ #[ doc( inline) ]
22
+ pub use chrono_datetime_as_bson_datetime_optional:: {
23
+ deserialize as deserialize_chrono_datetime_from_bson_datetime_optional,
24
+ serialize as serialize_chrono_datetime_as_bson_datetime_optional,
25
+ } ;
20
26
#[ doc( inline) ]
21
27
pub use hex_string_as_object_id:: {
22
28
deserialize as deserialize_hex_string_from_object_id,
@@ -307,6 +313,51 @@ pub mod chrono_datetime_as_bson_datetime {
307
313
}
308
314
}
309
315
316
+ /// Contains functions to serialize an [`Option<chrono::DateTime>`] as an
317
+ /// [`Option<crate::DateTime>`] and deserialize an [`Option<chrono::DateTime>`] from an
318
+ /// [`Option<crate::DateTime>`].
319
+ ///
320
+ /// ```rust
321
+ /// # #[cfg(feature = "chrono-0_4")]
322
+ /// # {
323
+ /// # use serde::{Serialize, Deserialize};
324
+ /// # use bson::serde_helpers::chrono_datetime_as_bson_datetime_optional;
325
+ /// #[derive(Serialize, Deserialize)]
326
+ /// struct Event {
327
+ /// #[serde(with = "chrono_datetime_as_bson_datetime_optional")]
328
+ /// pub date: Option<chrono::DateTime<chrono::Utc>>,
329
+ /// }
330
+ /// # }
331
+ /// ```
332
+ #[ cfg( feature = "chrono-0_4" ) ]
333
+ #[ cfg_attr( docsrs, doc( cfg( feature = "chrono-0_4" ) ) ) ]
334
+ pub mod chrono_datetime_as_bson_datetime_optional {
335
+ use crate :: DateTime ;
336
+ use chrono:: Utc ;
337
+ use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
338
+ use std:: result:: Result ;
339
+
340
+ /// Deserializes a [`chrono::DateTime`] from a [`crate::DateTime`].
341
+ #[ cfg_attr( docsrs, doc( cfg( feature = "chrono-0_4" ) ) ) ]
342
+ pub fn deserialize < ' de , D > ( deserializer : D ) -> Result < Option < chrono:: DateTime < Utc > > , D :: Error >
343
+ where
344
+ D : Deserializer < ' de > ,
345
+ {
346
+ let val = Option :: deserialize ( deserializer) ?. map ( |datetime : DateTime | datetime. to_chrono ( ) ) ;
347
+ Ok ( val)
348
+ }
349
+
350
+ /// Serializes a [`Option<chrono::DateTime>`] as a [`Option<crate::DateTime>`].
351
+ #[ cfg_attr( docsrs, doc( cfg( feature = "chrono-0_4" ) ) ) ]
352
+ pub fn serialize < S : Serializer > (
353
+ val : & Option < chrono:: DateTime < Utc > > ,
354
+ serializer : S ,
355
+ ) -> Result < S :: Ok , S :: Error > {
356
+ let datetime = val. map ( DateTime :: from_chrono) ;
357
+ datetime. serialize ( serializer)
358
+ }
359
+ }
360
+
310
361
/// Contains functions to serialize an RFC 3339 (ISO 8601) formatted string as a [`crate::DateTime`]
311
362
/// and deserialize an RFC 3339 (ISO 8601) formatted string from a [`crate::DateTime`].
312
363
///
0 commit comments