Skip to main content

proto_types/timestamp/
serde.rs

1use core::fmt;
2
3use serde::{de, ser};
4
5use crate::{Timestamp, ToString, format};
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.parse::<Timestamp>().map_err(|e| {
38					de::Error::custom(format!("Invalid timestamp string format: {e}"))
39				})?;
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}