added options
This commit is contained in:
67
src/main.rs
67
src/main.rs
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user