use core::fmt; use serde::{de::Visitor, Deserializer, Serializer}; use time::OffsetDateTime; pub(crate) fn serialize( time: &OffsetDateTime, ser: S, ) -> Result { ser.serialize_i64(time.unix_timestamp()) } struct I64Visitor; impl<'de> Visitor<'de> for I64Visitor { type Value = i64; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { write!(formatter, "an integer") } fn visit_i64(self, v: i64) -> Result { Ok(v) } fn visit_u64(self, v: u64) -> Result { Ok(v as i64) } } pub(crate) fn deserialize<'de, D: Deserializer<'de>>( de: D, ) -> Result { Ok( OffsetDateTime::from_unix_timestamp(de.deserialize_i64(I64Visitor)?) .unwrap_or_else(|_| OffsetDateTime::now_utc()), ) }