Skip to main content

timebased_id/
id.rs

1use std::time::{SystemTime, UNIX_EPOCH};
2
3use system_uptime::get_os_uptime;
4
5#[derive(Debug, Clone, Eq, PartialEq, Hash)]
6pub struct Id(u128);
7
8impl Default for Id {
9    fn default() -> Self {
10        let duration = SystemTime::now()
11            .duration_since(UNIX_EPOCH)
12            .expect("Time early unix epoch");
13        let now_nanoseconds = duration.as_nanos();
14
15        let uptime = get_os_uptime().expect("Uptime request failed") as u128;
16        let uptime = uptime << 64;
17
18        Self(uptime + now_nanoseconds)
19    }
20}
21
22impl Id {
23    pub fn value(&self) -> u128 {
24        self.0
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn test_default_constructor() {
34        let id = Id::default();
35
36        assert!(id.value() > 0);
37    }
38
39    #[test]
40    fn test_sequence_of_unique_id() {
41        let id1 = Id::default();
42        let id2 = Id::default();
43
44        assert!(id1 != id2);
45    }
46}