1use 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}