use std::process;
use atproto_record::tid::Tid;
use clap::Parser;
#[derive(Parser)]
#[command(
name = "atptid",
version,
about = "Generate and parse AT Protocol Timestamp Identifiers (TIDs)",
long_about = "
A command-line tool for generating and parsing AT Protocol TIDs (Timestamp
Identifiers). TIDs are 13-character base32-sortable strings combining a
microsecond timestamp with a random clock identifier.
MODES:
Generate: atptid Generate a single TID
Batch: atptid -n 5 Generate multiple TIDs
Parse: atptid <tid> Parse a TID and display its timestamp
Validate: atptid -q <tid> Validate a TID (exit 1 if invalid)
From time: atptid <timestamp> Generate a TID from microsecond timestamp
EXAMPLES:
atptid
atptid -n 10
atptid 3mgn37sytoc2c
atptid -q 3mgn37sytoc2c
atptid 1773067572000000
"
)]
struct Args {
input: Option<String>,
#[arg(short = 'n', long)]
count: Option<usize>,
#[arg(short, long)]
quiet: bool,
}
fn main() {
let args = Args::parse();
match args.input {
None => {
let count = args.count.unwrap_or(1);
for _ in 0..count {
println!("{}", Tid::new());
}
}
Some(input) => {
if input.chars().all(|c| c.is_ascii_digit()) {
let timestamp: u64 = input.parse().unwrap_or_else(|_| {
eprintln!("error-atproto-record-cli-11 Invalid timestamp: {input}");
process::exit(1);
});
let tid = Tid::new_with_time(timestamp);
println!("{tid}");
} else {
match Tid::decode(&input) {
Ok(tid) => {
if !args.quiet {
println!("{}", tid.timestamp_micros());
}
}
Err(err) => {
if !args.quiet {
eprintln!("{err}");
}
process::exit(1);
}
}
}
}
}
}