From f17172ee0d76cac528f4d6f7b4f9e6a832816423 Mon Sep 17 00:00:00 2001 From: Lncvrt Date: Sun, 11 Oct 2026 13:03:49 -0700 Subject: [PATCH] Initial commit --- .gitignore | 2 ++ Cargo.toml | 8 ++++++++ src/main.rs | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2ebc5ea --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +/Cargo.lock \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..e41ef10 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "password-generator" +version = "1.0.0" +edition = "2024" + +[dependencies] +rand = "0.10.3" +clap = { version = "4.6.7", features = ["derive"] } diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..8e3148f --- /dev/null +++ b/src/main.rs @@ -0,0 +1,56 @@ +use rand::RngExt; +use clap::Parser; + +pub fn generate_password( + length: usize, + use_upper: bool, + use_lower: bool, + use_numbers: bool, + use_symbols: bool, +) -> String { + let mut pool = String::new(); + if use_upper { pool.push_str("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); } + if use_lower { pool.push_str("abcdefghijklmnopqrstuvwxyz"); } + if use_numbers { pool.push_str("0123456789"); } + if use_symbols { pool.push_str("!@#$%^&*"); } + + if pool.is_empty() { + return String::new(); + } + + let mut rng = rand::rng(); + let chars_vec: Vec = pool.chars().collect(); + + (0..length) + .map(|_| { + let idx = rng.random_range(0..chars_vec.len()); + chars_vec[idx] + }) + .collect() +} + +#[derive(Parser, Debug)] +#[command(author = "Lncvrt", version, about = "A simple password generator CLI. To disable the use of uppercases or other stuff do \"--uppercase\"", long_about = None)] +struct Args { + #[arg(short, long, default_value_t = 8)] + length: usize, + + #[arg(short, long, default_value_t = true, action = clap::ArgAction::SetFalse)] + uppercase: bool, + + #[arg(short, long, default_value_t = true, action = clap::ArgAction::SetFalse)] + lowercase: bool, + + #[arg(short, long, default_value_t = true, action = clap::ArgAction::SetFalse)] + numbers: bool, + + #[arg(short, long, default_value_t = true, action = clap::ArgAction::SetFalse)] + symbols: bool, +} + +fn main() { + let args = Args::parse(); + + println!("Length: {}, Uppercase: {}, Lowercase: {}, Numbers: {}, Symbols: {}", args.length, args.uppercase, args.lowercase, args.numbers, args.symbols); + println!("Generated Password: {}", generate_password(args.length, args.uppercase, args.lowercase, args.numbers, args.symbols)) +} \ No newline at end of file