Skip to main content

time/
serde.rs

1//! Serde support using the RFC 3339 / RFC 9557 representation.
2
3use core::fmt;
4
5use serde::{
6    Deserialize, Deserializer, Serialize, Serializer,
7    de::{self, Visitor},
8};
9
10use crate::datetime::DateTime;
11
12impl Serialize for DateTime {
13    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
14    where
15        S: Serializer,
16    {
17        serializer.collect_str(self)
18    }
19}
20
21struct DateTimeVisitor;
22
23impl Visitor<'_> for DateTimeVisitor {
24    type Value = DateTime;
25
26    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
27        formatter.write_str("an RFC 3339 or RFC 9557 datetime string")
28    }
29
30    fn visit_str<E>(self, value: &str) -> Result<DateTime, E>
31    where
32        E: de::Error,
33    {
34        value.parse().map_err(de::Error::custom)
35    }
36}
37
38impl<'de> Deserialize<'de> for DateTime {
39    fn deserialize<D>(deserializer: D) -> Result<DateTime, D::Error>
40    where
41        D: Deserializer<'de>,
42    {
43        deserializer.deserialize_str(DateTimeVisitor)
44    }
45}