#[cfg(feature = "chrono")]
#[inline]
pub fn decode_timestamp(ts: i64) -> Timestamp {
#[cfg(target_family = "wasm")]
const PRECISION: i64 = 1_000;
#[cfg(not(target_family = "wasm"))]
const PRECISION: i64 = 1_000_000;
let s = ts / PRECISION;
let ns = (ts.rem_euclid(PRECISION) * (1_000_000_000 / PRECISION)) as u32;
Timestamp { s, ns }
}
#[cfg(feature = "chrono")]
pub struct Timestamp {
pub s: i64,
pub ns: u32,
}
#[cfg(feature = "uuid")]
pub(crate) const UUID_SIZE_IN_BYTES: usize = 16;
#[cfg(feature = "uuid")]
#[inline]
fn decode_uuid_ref(id: &[u8]) -> uuid::Uuid {
uuid::Uuid::from_bytes(
*<&[u8] as std::convert::TryInto<&[u8; UUID_SIZE_IN_BYTES]>>::try_into(id)
.expect("invalid uuid slice"),
)
}
#[cfg(feature = "uuid")]
#[inline]
pub fn decode_uuid(id: Vec<u8>) -> uuid::Uuid {
decode_uuid_ref(id.as_slice())
}
#[cfg(test)]
#[cfg(feature = "chrono")]
mod tests {
#[test]
fn test_decode_timestamp() {
#[cfg(not(target_family = "wasm"))]
{
let input: i64 = 3_496_567_123;
let super::Timestamp { s, ns } = super::decode_timestamp(input);
assert_eq!(s, 3_496);
assert_eq!(ns, 567_123_000);
}
#[cfg(target_family = "wasm")]
{
let input: i64 = 3_496_567;
let super::Timestamp { s, ns } = super::decode_timestamp(input);
assert_eq!(s, 3_496);
assert_eq!(ns, 567_000_000);
}
}
}