time/serde/
iso8601.rs
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::iso8601::{Config, EncodedConfig};
21use crate::format_description::well_known::Iso8601;
22use crate::OffsetDateTime;
23
24pub(crate) const SERDE_CONFIG: EncodedConfig =
26 Config::DEFAULT.set_year_is_six_digits(true).encode();
27
28#[cfg(feature = "formatting")]
30pub fn serialize<S: Serializer>(
31 datetime: &OffsetDateTime,
32 serializer: S,
33) -> Result<S::Ok, S::Error> {
34 datetime
35 .format(&Iso8601::<SERDE_CONFIG>)
36 .map_err(S::Error::custom)?
37 .serialize(serializer)
38}
39
40#[cfg(feature = "parsing")]
42pub fn deserialize<'a, D: Deserializer<'a>>(deserializer: D) -> Result<OffsetDateTime, D::Error> {
43 deserializer.deserialize_str(Visitor::<Iso8601<SERDE_CONFIG>>(PhantomData))
44}
45
46pub mod option {
54 #[allow(clippy::wildcard_imports)]
55 use super::*;
56
57 #[cfg(feature = "formatting")]
59 pub fn serialize<S: Serializer>(
60 option: &Option<OffsetDateTime>,
61 serializer: S,
62 ) -> Result<S::Ok, S::Error> {
63 option
64 .map(|odt| odt.format(&Iso8601::<SERDE_CONFIG>))
65 .transpose()
66 .map_err(S::Error::custom)?
67 .serialize(serializer)
68 }
69
70 #[cfg(feature = "parsing")]
72 pub fn deserialize<'a, D: Deserializer<'a>>(
73 deserializer: D,
74 ) -> Result<Option<OffsetDateTime>, D::Error> {
75 deserializer.deserialize_option(Visitor::<Option<Iso8601<SERDE_CONFIG>>>(PhantomData))
76 }
77}