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}