tetratto_shared/
snow.rs

1use std::time::{UNIX_EPOCH, Duration};
2use serde::{Deserialize, Serialize};
3use snowflaked::{Builder, Generator};
4
5pub const EPOCH_2024: u64 = 1704067200000;
6
7#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
8pub struct Snowflake(String);
9
10impl Default for Snowflake {
11    fn default() -> Self {
12        Self::new()
13    }
14}
15
16impl Snowflake {
17    pub fn builder() -> Builder {
18        Builder::new().epoch(UNIX_EPOCH + Duration::from_millis(EPOCH_2024))
19    }
20
21    /// Create a new [`Snowflake`]
22    pub fn new() -> Self {
23        Self(
24            Self::builder()
25                .build::<Generator>()
26                .generate::<u64>()
27                .to_string(),
28        )
29    }
30}
31
32impl std::fmt::Display for Snowflake {
33    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34        write!(f, "{}", self.0)
35    }
36}