1#[cfg(feature = "parsing")]
9use core::marker::PhantomData;
10
11#[cfg(feature = "formatting")]
12use serde::ser::Error as _;
13#[cfg(feature = "parsing")]
14use serde::Deserializer;
15#[cfg(feature = "formatting")]
16use serde::{Serialize, Serializer};
17
18#[cfg(feature = "parsing")]
19use super::Visitor;
20use crate::format_description::well_known::Rfc3339;
21use crate::OffsetDateTime;
22
23#[cfg(feature = "formatting")]
25#[inline]
26pub fn serialize<S: Serializer>(
27    datetime: &OffsetDateTime,
28    serializer: S,
29) -> Result<S::Ok, S::Error> {
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<'a>>(deserializer: D) -> Result<OffsetDateTime, D::Error> {
40    deserializer.deserialize_str(Visitor::<Rfc3339>(PhantomData))
41}
42
43pub mod option {
51    use super::*;
52
53    #[cfg(feature = "formatting")]
55    #[inline]
56    pub fn serialize<S: Serializer>(
57        option: &Option<OffsetDateTime>,
58        serializer: S,
59    ) -> Result<S::Ok, S::Error> {
60        option
61            .map(|odt| odt.format(&Rfc3339))
62            .transpose()
63            .map_err(S::Error::custom)?
64            .serialize(serializer)
65    }
66
67    #[cfg(feature = "parsing")]
69    #[inline]
70    pub fn deserialize<'a, D: Deserializer<'a>>(
71        deserializer: D,
72    ) -> Result<Option<OffsetDateTime>, D::Error> {
73        deserializer.deserialize_option(Visitor::<Option<Rfc3339>>(PhantomData))
74    }
75}