use typedflake::typedflake;
#[typedflake(epoch = "2025-01-01")]
pub struct UserId(i64);
#[typedflake(epoch = "2025-01-01")]
pub struct OrderId(i64);
fn main() -> Result<(), Box<dyn std::error::Error>> {
typedflake::init(17)?;
let user_id = UserId::generate()?;
let order_id = OrderId::generate()?;
println!("user {user_id} ({user_id:?})");
println!("order {order_id} ({order_id:?})");
let raw: i64 = user_id.get();
assert_eq!(UserId::try_from(raw)?, user_id);
assert_eq!(user_id.to_string().parse::<UserId>()?, user_id);
println!("negative input: {}", UserId::try_from(-1_i64).unwrap_err());
let parts = user_id.parts();
println!(
"elapsed {} ms, node {}, sequence {}",
parts.elapsed_millis, parts.node, parts.sequence
);
println!(
"created at {} ms since the Unix epoch",
user_id.unix_millis()?
);
assert_eq!(UserId::from_parts(parts)?, user_id);
Ok(())
}