snops_common/format/
impl_chrono.rs

1use chrono::{DateTime, Utc};
2
3use super::{DataFormat, DataReadError};
4
5impl DataFormat for DateTime<Utc> {
6    type Header = ();
7    const LATEST_HEADER: Self::Header = ();
8
9    fn write_data<W: std::io::Write>(
10        &self,
11        writer: &mut W,
12    ) -> Result<usize, super::DataWriteError> {
13        Ok(self.timestamp().write_data(writer)?
14            + self.timestamp_subsec_nanos().write_data(writer)?)
15    }
16
17    fn read_data<R: std::io::Read>(
18        reader: &mut R,
19        _header: &Self::Header,
20    ) -> Result<Self, super::DataReadError> {
21        let timestamp = i64::read_data(reader, &())?;
22        let subsec_nanos = u32::read_data(reader, &())?;
23        DateTime::from_timestamp(timestamp, subsec_nanos).ok_or_else(|| {
24            DataReadError::custom(format!(
25                "Invalid timestamp in datetime: {timestamp}.{subsec_nanos}"
26            ))
27        })
28    }
29}