use nulid::{Nulid, Result};
use nulid_derive::Id;
#[derive(Id)]
pub struct UserId(Nulid);
#[derive(Id)]
pub struct OrderId(pub Nulid);
#[derive(Id)]
pub struct ProductId(Nulid);
fn main() -> Result<()> {
println!("=== Id Derive Macro Example ===\n");
let user_id = UserId::new()?;
println!("Generated UserId with new(): {user_id}");
let default_user_id = UserId::default();
println!("Default UserId (ZERO): {default_user_id}");
let user_id_from_nulid = UserId::from(Nulid::new()?);
println!("UserId from Nulid: {user_id_from_nulid}");
let user_id_str = user_id.to_string();
println!("UserId as string: {user_id_str}");
let parsed_user_id = UserId::try_from(user_id_str.as_str())?;
println!("Parsed from &str: {parsed_user_id}");
assert_eq!(user_id, parsed_user_id);
let parsed_user_id2 = UserId::try_from(user_id_str.clone())?;
println!("Parsed from String: {parsed_user_id2}");
assert_eq!(user_id, parsed_user_id2);
let parsed_user_id3: UserId = user_id_str.parse()?;
println!("Parsed via FromStr: {parsed_user_id3}");
assert_eq!(user_id, parsed_user_id3);
println!("\n--- Conversion Between Nulid and Wrapper ---\n");
let order_id = OrderId::new()?;
println!("OrderId with new(): {order_id}");
let nulid = Nulid::new()?;
let order_id = OrderId::from(nulid);
println!("OrderId from Nulid: {order_id}");
let back_to_nulid: Nulid = order_id.into();
println!("Back to Nulid: {back_to_nulid}");
assert_eq!(nulid, back_to_nulid);
let nulid_ref: &Nulid = order_id.as_ref();
println!("AsRef<Nulid>: {nulid_ref}");
assert_eq!(&nulid, nulid_ref);
println!("\n--- Multiple Wrapper Types ---\n");
let product_id = ProductId::new()?;
println!("ProductId: {product_id}");
println!("OrderId: {order_id}");
let default_product = ProductId::default();
println!("Default ProductId (ZERO): {default_product}");
let product_nulid: Nulid = product_id.into();
let order_nulid: Nulid = order_id.into();
println!(
"Product and Order IDs are different: {}",
product_nulid != order_nulid
);
println!("\n--- Error Handling ---\n");
match UserId::try_from("invalid-nulid-string") {
Ok(id) => println!("Unexpected success: {id}"),
Err(e) => println!("Expected error parsing invalid string: {e}"),
}
match UserId::try_from("SHORT") {
Ok(id) => println!("Unexpected success: {id}"),
Err(e) => println!("Expected error with wrong length: {e}"),
}
println!("\n--- Direct Access to Nulid Methods (via Deref) ---\n");
let user_id = UserId::new()?;
let nanos = user_id.nanos();
let micros = user_id.micros();
let millis = user_id.millis();
let seconds = user_id.seconds();
let subsec_nanos = user_id.subsec_nanos();
println!("Direct method access on UserId:");
println!(" Nanoseconds: {nanos}");
println!(" Microseconds: {micros}");
println!(" Milliseconds: {millis}");
println!(" Seconds: {seconds}");
println!(" Subsec nanos: {subsec_nanos}");
let random = user_id.random();
println!(" Random bits: {random}");
let (timestamp, rand) = user_id.parts();
println!(" Parts: timestamp={timestamp}, random={rand}");
let as_u128 = user_id.as_u128();
let as_bytes = user_id.to_bytes();
println!(" As u128: {as_u128}");
println!(" As bytes: {:?}", &as_bytes[..4]);
let default_id = UserId::default();
println!("\n Is default ID nil? {}", default_id.is_nil());
println!(" Is regular ID nil? {}", user_id.is_nil());
println!("\n=== Example Complete ===");
Ok(())
}