1#[cfg(feature = "parsing")]
9use core::marker::PhantomData;
10
11#[cfg(feature = "parsing")]
12use serde_core::Deserializer;
13#[cfg(feature = "formatting")]
14use serde_core::ser::Error as _;
15#[cfg(feature = "formatting")]
16use serde_core::{Serialize, Serializer};
17
18#[cfg(feature = "parsing")]
19use super::Visitor;
20use crate::OffsetDateTime;
21use crate::format_description::well_known::Rfc3339;
22
23#[cfg(feature = "formatting")]
25#[inline]
26pub fn serialize<S>(datetime: &OffsetDateTime, serializer: S) -> Result<S::Ok, S::Error>
27where
28 S: Serializer,
29{
30 datetime
31 .format(&Rfc3339)
32 .map_err(S::Error::custom)?
33 .serialize(serializer)
34}
35
36#[cfg(feature = "parsing")]
38#[inline]
39pub fn deserialize<'a, D>(deserializer: D) -> Result<OffsetDateTime, D::Error>
40where
41 D: Deserializer<'a>,
42{
43 deserializer.deserialize_str(Visitor::<Rfc3339>(PhantomData))
44}
45
46pub mod option {
58 use super::*;
59
60 #[cfg(feature = "formatting")]
62 #[inline]
63 pub fn serialize<S>(option: &Option<OffsetDateTime>, serializer: S) -> Result<S::Ok, S::Error>
64 where
65 S: Serializer,
66 {
67 option
68 .map(|odt| odt.format(&Rfc3339))
69 .transpose()
70 .map_err(S::Error::custom)?
71 .serialize(serializer)
72 }
73
74 #[cfg(feature = "parsing")]
76 #[inline]
77 pub fn deserialize<'a, D>(deserializer: D) -> Result<Option<OffsetDateTime>, D::Error>
78 where
79 D: Deserializer<'a>,
80 {
81 deserializer.deserialize_option(Visitor::<Option<Rfc3339>>(PhantomData))
82 }
83}