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 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}