msgpack/pack/
timestamp.rs1use 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}