sos_core/encoding/v1/
date_time.rs

1use crate::{encoding::encoding_error, UtcDateTime};
2use async_trait::async_trait;
3use binary_stream::futures::{
4    BinaryReader, BinaryWriter, Decodable, Encodable,
5};
6use std::io::Result;
7use time::{Duration, OffsetDateTime};
8use tokio::io::{AsyncRead, AsyncSeek, AsyncWrite};
9
10#[async_trait]
11impl Encodable for UtcDateTime {
12    async fn encode<W: AsyncWrite + AsyncSeek + Unpin + Send>(
13        &self,
14        writer: &mut BinaryWriter<W>,
15    ) -> Result<()> {
16        let seconds = self.0.unix_timestamp();
17        let nanos = self.0.nanosecond();
18        writer.write_i64(seconds).await?;
19        writer.write_u32(nanos).await?;
20        Ok(())
21    }
22}
23
24#[async_trait]
25impl Decodable for UtcDateTime {
26    async fn decode<R: AsyncRead + AsyncSeek + Unpin + Send>(
27        &mut self,
28        reader: &mut BinaryReader<R>,
29    ) -> Result<()> {
30        let seconds = reader.read_i64().await?;
31        let nanos = reader.read_u32().await?;
32        self.0 = OffsetDateTime::from_unix_timestamp(seconds)
33            .map_err(encoding_error)?
34            + Duration::nanoseconds(nanos as i64);
35        Ok(())
36    }
37}