use chrono::{DateTime, Utc};
use miniserde::de::Visitor;
use miniserde::ser::Fragment;
pub fn begin(out: &mut Option<DateTime<Utc>>) -> &mut dyn Visitor {
Place::new(out)
}
pub fn serialize(value: &DateTime<Utc>) -> Fragment<'_> {
Fragment::I64(value.timestamp())
}
#[repr(C)]
struct Place {
out: Option<DateTime<Utc>>,
}
impl Place {
fn new(out: &mut Option<DateTime<Utc>>) -> &mut Self {
unsafe { &mut *std::ptr::addr_of_mut!(*out).cast::<Place>() }
}
}
impl Visitor for Place {
fn negative(&mut self, n: i64) -> miniserde::Result<()> {
if let Some(dt) = DateTime::from_timestamp(n, 0) {
self.out = Some(dt);
Ok(())
} else {
Err(miniserde::Error)
}
}
fn nonnegative(&mut self, n: u64) -> miniserde::Result<()> {
let n = n as i64;
if let Some(dt) = DateTime::from_timestamp(n, 0) {
self.out = Some(dt);
Ok(())
} else {
Err(miniserde::Error)
}
}
}