Skip to main content

wpl/
pkg.rs

1use std::sync::OnceLock;
2use std::sync::atomic::{AtomicU64, Ordering};
3use std::time::{SystemTime, UNIX_EPOCH};
4
5pub type PkgID = u64;
6
7pub const DEFAULT_KEY: &str = "_";
8
9static ORDER_COUNTER: AtomicU64 = AtomicU64::new(0);
10static PKG_ID_BASE: OnceLock<u64> = OnceLock::new();
11
12fn pkg_id_base() -> u64 {
13    *PKG_ID_BASE.get_or_init(|| {
14        let secs = SystemTime::now()
15            .duration_since(UNIX_EPOCH)
16            .unwrap_or_default()
17            .as_secs();
18        (secs & 0xFFFF_FFFF) << 24
19    })
20}
21
22pub fn gen_pkg_id() -> u64 {
23    pkg_id_base() + ORDER_COUNTER.fetch_add(1, Ordering::Relaxed)
24}
25
26#[cfg(test)]
27mod tests {
28    use crate::pkg::gen_pkg_id;
29
30    #[test]
31    fn test_gen_id() {
32        let a = gen_pkg_id();
33        let b = gen_pkg_id();
34        assert_ne!(a, b);
35        println!("{},{}", a, b);
36    }
37}