proto_types/timestamp/
serde.rs

1use std::fmt;
2
3use serde::{de, ser};
4
5use crate::Timestamp;
6
7impl ser::Serialize for Timestamp {
8  fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
9  where
10    S: ser::Serializer,
11  {
12    let mut ts_normalized = *self;
13    ts_normalized.normalize();
14
15    serializer.serialize_str(&self.to_string())
16  }
17}
18
19impl<'de> de::Deserialize<'de> for Timestamp {
20  fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
21  where
22    D: de::Deserializer<'de>,
23  {
24    struct TimestampVisitor;
25
26    impl de::Visitor<'_> for TimestampVisitor {
27      type Value = Timestamp;
28
29      fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
30        formatter.write_str("an RFC 3339 formatted timestamp string")
31      }
32
33      fn visit_str<E>(self, value: &str) -> Result<Timestamp, E>
34      where
35        E: de::Error,
36      {
37        let datetime = value
38          .parse::<Timestamp>()
39          .map_err(|e| de::Error::custom(format!("Invalid timestamp string format: {}", e)))?;
40
41        let prost_timestamp = Timestamp {
42          seconds: datetime.seconds,
43          nanos: datetime.nanos,
44        };
45
46        Ok(prost_timestamp)
47      }
48    }
49
50    deserializer.deserialize_str(TimestampVisitor)
51  }
52}