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}