added options

This commit is contained in:
2026-10-23 13:09:02 -04:00
parent 13f9d42c78
commit 5146ecb062
4 changed files with 272 additions and 10 deletions

View File

@@ -1,16 +1,71 @@
use clap::{Parser, ValueEnum};
use rand::seq::IndexedRandom;
use rand::RngExt;
use rand::{Rng, RngExt};
use std::fs;
const WORDS: &str = include_str!("../words.txt");
fn main() {
let words: Vec<&str> = WORDS.lines().collect();
#[derive(Clone, ValueEnum)]
enum Format {
Csv,
Txt,
}
#[derive(Parser)]
#[command(version, about = "Random word + number generator")]
struct Args {
#[arg(long, default_value_t = 1)]
words: usize,
#[arg(long, default_value_t = 4)]
digits: usize,
#[arg(long, default_value_t = 1)]
bulk: usize,
#[arg(long, default_value = "")]
sep: String,
#[arg(long, value_enum)]
save: Option<Format>,
#[arg(long, default_value = "rusty-pw")]
out: String,
}
fn generate(words: &[&str], rng: &mut impl Rng, args: &Args) -> String {
let mut picked: Vec<&str> = Vec::with_capacity(args.words);
for _ in 0..args.words {
picked.push(words.choose(rng).expect("word list is empty"));
}
let number: String = (0..args.digits)
.map(|_| char::from(b'0' + rng.random_range(0..10u8)))
.collect();
format!("{}{}", picked.join(&args.sep), number)
}
fn main() {
let args = Args::parse();
let words: Vec<&str> = WORDS.lines().filter(|w| !w.is_empty()).collect();
let mut rng = rand::rng();
let word = words.choose(&mut rng).expect("word list is empty");
let results: Vec<String> = (0..args.bulk)
.map(|_| generate(&words, &mut rng, &args))
.collect();
let number = rng.random_range(0..10000);
for r in &results {
println!("{}", r);
}
println!("{}{:04}", word, number);
if let Some(format) = &args.save {
let (ext, contents) = match format {
Format::Txt => ("txt", results.join("\n")),
Format::Csv => ("csv", format!("password\n{}", results.join("\n"))),
};
let path = format!("{}.{}", args.out, ext);
fs::write(&path, contents + "\n").expect("could not write output file");
eprintln!("saved {} results to {}", results.len(), path);
}
}