45 lines
1.2 KiB
Rust
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);
|
|
}
|