39 lines
889 B
Rust
39 lines
889 B
Rust
use core::fmt;
|
|
|
|
use serde::{de::Visitor, Deserializer, Serializer};
|
|
use time::OffsetDateTime;
|
|
|
|
pub(crate) fn serialize<S: Serializer>(
|
|
time: &OffsetDateTime,
|
|
ser: S,
|
|
) -> Result<S::Ok, S::Error> {
|
|
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<E>(self, v: i64) -> Result<Self::Value, E> {
|
|
Ok(v)
|
|
}
|
|
|
|
fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E> {
|
|
Ok(v as i64)
|
|
}
|
|
}
|
|
|
|
pub(crate) fn deserialize<'de, D: Deserializer<'de>>(
|
|
de: D,
|
|
) -> Result<OffsetDateTime, D::Error> {
|
|
Ok(
|
|
OffsetDateTime::from_unix_timestamp(de.deserialize_i64(I64Visitor)?)
|
|
.unwrap_or_else(|_| OffsetDateTime::now_utc()),
|
|
)
|
|
}
|