messagepack_core/encode/
timestamp.rs

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