proto_types/timestamp/
serde.rs1use 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}