sos_core/encoding/v1/
date_time.rs1use 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}