libsignal_protocol/
timestamp.rs

1//
2// Copyright 2024 Signal Messenger, LLC.
3// SPDX-License-Identifier: AGPL-3.0-only
4//
5
6use serde::{Deserialize, Serialize};
7
8/// Timestamp recorded as milliseconds since the Unix epoch.
9#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
10#[repr(transparent)]
11pub struct Timestamp(u64);
12
13impl Timestamp {
14    pub const fn from_epoch_millis(milliseconds: u64) -> Self {
15        Self(milliseconds)
16    }
17
18    pub const fn epoch_millis(&self) -> u64 {
19        self.0
20    }
21
22    pub fn add_millis(&self, milliseconds: u64) -> Self {
23        Self(self.0 + milliseconds)
24    }
25
26    pub fn sub_millis(&self, milliseconds: u64) -> Timestamp {
27        Self(self.0 - milliseconds)
28    }
29}
30
31impl From<Timestamp> for std::time::SystemTime {
32    fn from(value: Timestamp) -> Self {
33        Self::UNIX_EPOCH + std::time::Duration::from_millis(value.epoch_millis())
34    }
35}
36
37impl rand::distributions::Distribution<Timestamp> for rand::distributions::Standard {
38    fn sample<R: rand::prelude::Rng + ?Sized>(&self, rng: &mut R) -> Timestamp {
39        Timestamp(Self::sample(self, rng))
40    }
41}