sup-randpass/src/main.rs

45 lines
1.2 KiB
Rust

/// SPDX-FileCopyrightText: 2023-2024 sup39 <dev@sup39.dev>
/// SPDX-License-Identifier: MIT OR Apache-2.0
use rand::prelude::*;
const DEFAULT_LENGTH: usize = 36;
fn main() {
let mut args = std::env::args();
let _ = args.next(); // drop argv[0]
let length = args.next()
.map(|s| {
s.parse::<usize>()
.map_err(|_| format!("Length should be nonnegative, got {s}"))
.unwrap()
})
.unwrap_or(DEFAULT_LENGTH);
let mut charset = Vec::<char>::new();
args.for_each(|s| match s.as_str() {
"-s" => charset.push(' '),
"-w" => {
charset.extend('0'..='9');
charset.extend('A'..='Z');
charset.extend('a'..='z');
},
"-d" => charset.extend('0'..='9'),
"-a" => {
charset.extend('A'..='Z');
charset.extend('a'..='z');
},
"-u" => charset.extend('A'..='Z'),
"-l" => charset.extend('a'..='z'),
"--" => charset.push('-'),
s => charset.extend(s.chars()),
});
if charset.is_empty() {
charset = (' '..='~').collect();
}
let mut rng = rand::thread_rng();
let result: String = (0..length)
.map(|_| charset.choose(&mut rng).unwrap())
.collect();
print!("{}", result);
}