sos_sdk/encoding/v1/
timestamp.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use crate::{encoding::encoding_error, UtcDateTime};
use async_trait::async_trait;
use binary_stream::futures::{
    BinaryReader, BinaryWriter, Decodable, Encodable,
};
use futures::io::{AsyncRead, AsyncSeek, AsyncWrite};
use std::io::Result;
use time::{Duration, OffsetDateTime};

#[async_trait]
impl Encodable for UtcDateTime {
    async fn encode<W: AsyncWrite + AsyncSeek + Unpin + Send>(
        &self,
        writer: &mut BinaryWriter<W>,
    ) -> Result<()> {
        let seconds = self.0.unix_timestamp();
        let nanos = self.0.nanosecond();
        writer.write_i64(seconds).await?;
        writer.write_u32(nanos).await?;
        Ok(())
    }
}

#[async_trait]
impl Decodable for UtcDateTime {
    async fn decode<R: AsyncRead + AsyncSeek + Unpin + Send>(
        &mut self,
        reader: &mut BinaryReader<R>,
    ) -> Result<()> {
        let seconds = reader.read_i64().await?;
        let nanos = reader.read_u32().await?;

        self.0 = OffsetDateTime::from_unix_timestamp(seconds)
            .map_err(encoding_error)?
            + Duration::nanoseconds(nanos as i64);
        Ok(())
    }
}