use std::time::Duration;
use typedflake::{GenerateError, typedflake};
#[typedflake(epoch = "2025-01-01", bits(timestamp = 41, node = 10, sequence = 2))]
pub struct TicketId(i64);
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
typedflake::init(1)?;
let exhausted =
(0..1_000).any(|_| matches!(TicketId::generate(), Err(GenerateError::SequenceExhausted)));
println!("ran out of sequence numbers: {exhausted}");
let id = TicketId::generate_blocking()?;
println!("blocking: {id}");
let id = tokio::time::timeout(Duration::from_millis(20), TicketId::generate_async()).await??;
println!("async: {id}");
Ok(())
}