messagepack-core 0.2.4

messagepack for `no_std`
Documentation
//! Timestamp encoding implementations and tests.

use super::{TIMESTAMP_EXTENSION_TYPE, Timestamp32, Timestamp64, Timestamp96};
use crate::{
    encode::{self, Encode},
    extension::FixedExtension,
    io::IoWrite,
};

impl Encode for Timestamp32 {
    fn encode<W: IoWrite>(
        &self,
        writer: &mut W,
    ) -> core::result::Result<usize, encode::Error<W::Error>> {
        let buf = self.to_buf();
        FixedExtension::new_fixed(TIMESTAMP_EXTENSION_TYPE, buf).encode(writer)
    }
}

impl Encode for Timestamp64 {
    fn encode<W: IoWrite>(
        &self,
        writer: &mut W,
    ) -> core::result::Result<usize, encode::Error<W::Error>> {
        let buf = self.to_buf();
        FixedExtension::new_fixed(TIMESTAMP_EXTENSION_TYPE, buf).encode(writer)
    }
}

impl Encode for Timestamp96 {
    fn encode<W: IoWrite>(
        &self,
        writer: &mut W,
    ) -> core::result::Result<usize, encode::Error<W::Error>> {
        let buf = self.to_buf();
        FixedExtension::new_fixed(TIMESTAMP_EXTENSION_TYPE, buf).encode(writer)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    const TIMESTAMP_EXT_TYPE_U8: u8 = 255; // -1

    #[test]
    fn encode_timestamp32() {
        let ts = Timestamp32::new(123456);
        let mut buf = vec![];

        let n = Encode::encode(&ts, &mut buf).unwrap();

        let mut expected = vec![0xd6, TIMESTAMP_EXT_TYPE_U8];
        expected.extend_from_slice(&123456_u32.to_be_bytes());

        assert_eq!(buf, expected);
        assert_eq!(n, expected.len());
    }

    #[test]
    fn encode_timestamp64() {
        let ts = Timestamp64::new(123456, 789).unwrap();
        let mut buf = vec![];

        let n = Encode::encode(&ts, &mut buf).unwrap();

        let mut expected = vec![0xd7, TIMESTAMP_EXT_TYPE_U8];
        let data = (789u64 << 34) | 123456;
        expected.extend_from_slice(&data.to_be_bytes());

        assert_eq!(buf, expected);
        assert_eq!(n, expected.len());
    }

    #[test]
    fn encode_timestamp96() {
        let ts = Timestamp96::new(123456, 789).unwrap();
        let mut buf = vec![];

        let n = Encode::encode(&ts, &mut buf).unwrap();

        let mut expected = vec![0xc7, 12, TIMESTAMP_EXT_TYPE_U8];
        expected.extend_from_slice(&789_u32.to_be_bytes());
        expected.extend_from_slice(&123456_u64.to_be_bytes());

        assert_eq!(buf, expected);
        assert_eq!(n, expected.len());
    }
}