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