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::Rfc2822;
21use crate::OffsetDateTime;
22
23#[cfg(feature = "formatting")]
25pub fn serialize<S: Serializer>(
26 datetime: &OffsetDateTime,
27 serializer: S,
28) -> Result<S::Ok, S::Error> {
29 datetime
30 .format(&Rfc2822)
31 .map_err(S::Error::custom)?
32 .serialize(serializer)
33}
34
35#[cfg(feature = "parsing")]
37pub fn deserialize<'a, D: Deserializer<'a>>(deserializer: D) -> Result<OffsetDateTime, D::Error> {
38 deserializer.deserialize_str(Visitor::<Rfc2822>(PhantomData))
39}
40
41pub mod option {
49 use super::*;
50
51 #[cfg(feature = "formatting")]
53 pub fn serialize<S: Serializer>(
54 option: &Option<OffsetDateTime>,
55 serializer: S,
56 ) -> Result<S::Ok, S::Error> {
57 option
58 .map(|odt| odt.format(&Rfc2822))
59 .transpose()
60 .map_err(S::Error::custom)?
61 .serialize(serializer)
62 }
63
64 #[cfg(feature = "parsing")]
66 pub fn deserialize<'a, D: Deserializer<'a>>(
67 deserializer: D,
68 ) -> Result<Option<OffsetDateTime>, D::Error> {
69 deserializer.deserialize_option(Visitor::<Option<Rfc2822>>(PhantomData))
70 }
71}