use clap::{Parser, Subcommand, ValueEnum};
#[derive(Parser)]
#[command(
name = "idt",
author,
version,
about = "A fast, ergonomic CLI tool for working with various ID formats",
long_about = "IDT (ID Tool) - Generate, inspect, convert, and validate various identifier formats.\n\n\
Supports UUID (all versions), ULID, NanoID, Snowflake, and more.",
after_help = "Examples:\n \
idt gen uuid Generate a UUIDv4\n \
idt gen ulid Generate a ULID\n \
idt inspect <ID> Analyze and decode an ID\n \
idt convert <ID> -f hex Convert ID to hexadecimal"
)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
#[arg(short, long, global = true)]
pub json: bool,
#[arg(short, long, global = true)]
pub pretty: bool,
#[arg(long, global = true)]
pub no_color: bool,
}
#[derive(Subcommand)]
pub enum Commands {
#[command(visible_alias = "g")]
Gen(GenArgs),
#[command(visible_alias = "i")]
Inspect(InspectArgs),
#[command(visible_alias = "c")]
Convert(ConvertArgs),
#[command(visible_alias = "v")]
Validate(ValidateArgs),
Compare(CompareArgs),
Info(InfoArgs),
}
#[derive(Parser)]
pub struct GenArgs {
#[arg(value_name = "TYPE")]
pub id_type: String,
#[arg(short = 'n', long, default_value = "1")]
pub count: usize,
#[arg(short, long)]
pub format: Option<String>,
#[arg(long)]
pub no_newline: bool,
#[arg(long, value_name = "VERSION")]
pub uuid_version: Option<u8>,
#[arg(long)]
pub namespace: Option<String>,
#[arg(long)]
pub name: Option<String>,
#[arg(long)]
pub alphabet: Option<String>,
#[arg(long)]
pub length: Option<usize>,
#[arg(long)]
pub epoch: Option<u64>,
#[arg(long)]
pub machine_id: Option<u16>,
#[arg(long)]
pub datacenter_id: Option<u16>,
#[arg(long)]
pub prefix: Option<String>,
}
#[derive(Parser)]
pub struct InspectArgs {
#[arg(value_name = "ID")]
pub ids: Vec<String>,
#[arg(short = 't', long, value_name = "TYPE")]
pub id_type: Option<String>,
#[arg(short, long)]
pub quiet: bool,
}
#[derive(Parser)]
pub struct ConvertArgs {
#[arg(value_name = "ID")]
pub ids: Vec<String>,
#[arg(short = 't', long, value_name = "TYPE")]
pub id_type: Option<String>,
#[arg(short, long, value_name = "FORMAT")]
pub format: Option<String>,
#[arg(long, value_name = "TYPE")]
pub to: Option<String>,
#[arg(short = 'U', long)]
pub uppercase: bool,
#[arg(short = 'L', long)]
pub lowercase: bool,
}
#[derive(Parser)]
pub struct ValidateArgs {
#[arg(value_name = "ID")]
pub ids: Vec<String>,
#[arg(short = 't', long, value_name = "TYPE")]
pub id_type: Option<String>,
#[arg(short, long)]
pub quiet: bool,
#[arg(long)]
pub strict: bool,
}
#[derive(Parser)]
pub struct CompareArgs {
pub id1: String,
pub id2: String,
#[arg(short = 't', long, value_name = "TYPE")]
pub id_type: Option<String>,
}
#[derive(Parser)]
pub struct InfoArgs {
#[arg(value_name = "TYPE")]
pub id_type: Option<String>,
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum OutputFormat {
Human,
Json,
Plain,
Csv,
Tsv,
}