msgpack/pack/
timestamp.rs

1use super::primitive::*;
2use crate::{code, PackError};
3use std::io;
4
5pub fn pack_timestamp<W: io::Write>(writer: &mut W, sec: i64, nsec: u32) -> Result<(), PackError> {
6    if sec >> 34 == 0 {
7        if nsec == 0 {
8            pack_timestamp32(writer, sec as u32)
9        } else {
10            pack_timestamp64(writer, sec as u64, nsec)
11        }
12    } else {
13        pack_timestamp96(writer, sec, nsec)
14    }
15}
16
17pub fn pack_timestamp32<W: io::Write>(writer: &mut W, sec: u32) -> Result<(), PackError> {
18    write_data_u8(writer, code::FIXEXT4)?;
19    write_data_i8(writer, -1)?;
20    write_data_u32(writer, sec)
21}
22
23pub fn pack_timestamp64<W: io::Write>(
24    writer: &mut W,
25    sec: u64,
26    nsec: u32,
27) -> Result<(), PackError> {
28    if sec >> 34 != 0 || nsec >> 30 != 0 {
29        use std::io::ErrorKind;
30        return Err(PackError::WriteError(io::Error::new(
31            ErrorKind::Other,
32            "Value is out of range for timestamp64",
33        )));
34    }
35    write_data_u8(writer, code::FIXEXT8)?;
36    write_data_i8(writer, -1)?;
37    let payload: u64 = ((nsec as u64) << 34) | sec;
38    write_data_u64(writer, payload)
39}
40
41pub fn pack_timestamp96<W: io::Write>(
42    writer: &mut W,
43    sec: i64,
44    nsec: u32,
45) -> Result<(), PackError> {
46    write_data_u8(writer, code::EXT8)?;
47    write_data_u8(writer, 12)?;
48    write_data_i8(writer, -1)?;
49    write_data_u32(writer, nsec)?;
50    write_data_i64(writer, sec)
51}