Skip to main content

messagepack_core/timestamp/
encode.rs

1//! Timestamp encoding implementations and tests.
2
3use super::{TIMESTAMP_EXTENSION_TYPE, Timestamp32, Timestamp64, Timestamp96};
4use crate::{
5    encode::{self, Encode},
6    extension::FixedExtension,
7    io::IoWrite,
8};
9
10impl Encode for Timestamp32 {
11    fn encode<W: IoWrite>(
12        &self,
13        writer: &mut W,
14    ) -> core::result::Result<usize, encode::Error<W::Error>> {
15        let buf = self.to_buf();
16        FixedExtension::new_fixed(TIMESTAMP_EXTENSION_TYPE, buf).encode(writer)
17    }
18}
19
20impl Encode for Timestamp64 {
21    fn encode<W: IoWrite>(
22        &self,
23        writer: &mut W,
24    ) -> core::result::Result<usize, encode::Error<W::Error>> {
25        let buf = self.to_buf();
26        FixedExtension::new_fixed(TIMESTAMP_EXTENSION_TYPE, buf).encode(writer)
27    }
28}
29
30impl Encode for Timestamp96 {
31    fn encode<W: IoWrite>(
32        &self,
33        writer: &mut W,
34    ) -> core::result::Result<usize, encode::Error<W::Error>> {
35        let buf = self.to_buf();
36        FixedExtension::new_fixed(TIMESTAMP_EXTENSION_TYPE, buf).encode(writer)
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    const TIMESTAMP_EXT_TYPE_U8: u8 = 255; // -1
45
46    #[test]
47    fn encode_timestamp32() {
48        let ts = Timestamp32::new(123456);
49        let mut buf = vec![];
50
51        let n = Encode::encode(&ts, &mut buf).unwrap();
52
53        let mut expected = vec![0xd6, TIMESTAMP_EXT_TYPE_U8];
54        expected.extend_from_slice(&123456_u32.to_be_bytes());
55
56        assert_eq!(buf, expected);
57        assert_eq!(n, expected.len());
58    }
59
60    #[test]
61    fn encode_timestamp64() {
62        let ts = Timestamp64::new(123456, 789).unwrap();
63        let mut buf = vec![];
64
65        let n = Encode::encode(&ts, &mut buf).unwrap();
66
67        let mut expected = vec![0xd7, TIMESTAMP_EXT_TYPE_U8];
68        let data = (789u64 << 34) | 123456;
69        expected.extend_from_slice(&data.to_be_bytes());
70
71        assert_eq!(buf, expected);
72        assert_eq!(n, expected.len());
73    }
74
75    #[test]
76    fn encode_timestamp96() {
77        let ts = Timestamp96::new(123456, 789).unwrap();
78        let mut buf = vec![];
79
80        let n = Encode::encode(&ts, &mut buf).unwrap();
81
82        let mut expected = vec![0xc7, 12, TIMESTAMP_EXT_TYPE_U8];
83        expected.extend_from_slice(&789_u32.to_be_bytes());
84        expected.extend_from_slice(&123456_u64.to_be_bytes());
85
86        assert_eq!(buf, expected);
87        assert_eq!(n, expected.len());
88    }
89}