use super::{TIMESTAMP_EXTENSION_TYPE, Timestamp32, Timestamp64, Timestamp96};
use crate::{
encode::{self, Encode},
extension::FixedExtension,
io::IoWrite,
};
impl Encode for Timestamp32 {
fn encode<W: IoWrite>(
&self,
writer: &mut W,
) -> core::result::Result<usize, encode::Error<W::Error>> {
let buf = self.to_buf();
FixedExtension::new_fixed(TIMESTAMP_EXTENSION_TYPE, buf).encode(writer)
}
}
impl Encode for Timestamp64 {
fn encode<W: IoWrite>(
&self,
writer: &mut W,
) -> core::result::Result<usize, encode::Error<W::Error>> {
let buf = self.to_buf();
FixedExtension::new_fixed(TIMESTAMP_EXTENSION_TYPE, buf).encode(writer)
}
}
impl Encode for Timestamp96 {
fn encode<W: IoWrite>(
&self,
writer: &mut W,
) -> core::result::Result<usize, encode::Error<W::Error>> {
let buf = self.to_buf();
FixedExtension::new_fixed(TIMESTAMP_EXTENSION_TYPE, buf).encode(writer)
}
}
#[cfg(test)]
mod tests {
use super::*;
const TIMESTAMP_EXT_TYPE_U8: u8 = 255;
#[test]
fn encode_timestamp32() {
let ts = Timestamp32::new(123456);
let mut buf = vec![];
let n = Encode::encode(&ts, &mut buf).unwrap();
let mut expected = vec![0xd6, TIMESTAMP_EXT_TYPE_U8];
expected.extend_from_slice(&123456_u32.to_be_bytes());
assert_eq!(buf, expected);
assert_eq!(n, expected.len());
}
#[test]
fn encode_timestamp64() {
let ts = Timestamp64::new(123456, 789).unwrap();
let mut buf = vec![];
let n = Encode::encode(&ts, &mut buf).unwrap();
let mut expected = vec![0xd7, TIMESTAMP_EXT_TYPE_U8];
let data = (789u64 << 34) | 123456;
expected.extend_from_slice(&data.to_be_bytes());
assert_eq!(buf, expected);
assert_eq!(n, expected.len());
}
#[test]
fn encode_timestamp96() {
let ts = Timestamp96::new(123456, 789).unwrap();
let mut buf = vec![];
let n = Encode::encode(&ts, &mut buf).unwrap();
let mut expected = vec![0xc7, 12, TIMESTAMP_EXT_TYPE_U8];
expected.extend_from_slice(&789_u32.to_be_bytes());
expected.extend_from_slice(&123456_u64.to_be_bytes());
assert_eq!(buf, expected);
assert_eq!(n, expected.len());
}
}