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::Str(std::borrow::Cow::Owned(value.to_rfc3339()))
}
#[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 string(&mut self, s: &str) -> miniserde::Result<()> {
let dt = DateTime::parse_from_rfc3339(s).map_err(|_| miniserde::Error)?;
self.out = Some(dt.with_timezone(&Utc));
Ok(())
}
}