Add generate command

This commit is contained in:
TheAwiteb 2023-12-24 20:27:50 +03:00
parent 4b15b9403a
commit 4e333d9665
No known key found for this signature in database
GPG key ID: ABF818BD15DC2D34
2 changed files with 69 additions and 1 deletions

66
src/cli/gen_command.rs Normal file
View file

@ -0,0 +1,66 @@
// Local CLI password manager
// Copyright (C) 2024 Awiteb
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/gpl-3.0.html>.
use std::num::NonZeroU64;
use clap::Args;
use crate::{password::Passwords, PassrsError, PassrsResult, RunCommand};
#[derive(Debug, Args)]
#[command(author, version, about, long_about = None)]
pub struct Gen {
/// The password length
#[arg(default_value_t = NonZeroU64::new(18).unwrap())]
length: NonZeroU64,
/// With uppercase letters (A-Z)
#[arg(short, long)]
uppercase: bool,
/// With lowercase letters (a-z)
#[arg(short, long)]
lowercase: bool,
/// With numbers (0-9)
#[arg(short, long)]
numbers: bool,
/// With symbols (!,# ...)
#[arg(short, long)]
symbols: bool,
}
impl RunCommand for Gen {
fn run(&self, _password_manager: Passwords) -> PassrsResult<()> {
if self.uppercase || self.lowercase || self.numbers || self.symbols {
println!(
"{}",
passwords::PasswordGenerator::new()
.length(self.length.get() as usize)
.uppercase_letters(self.uppercase)
.lowercase_letters(self.lowercase)
.numbers(self.numbers)
.symbols(self.symbols)
.strict(true)
.generate_one()
.expect("The length cannot be zero")
);
Ok(())
} else {
Err(PassrsError::Other(
"You need to enable at least one kind of characters".to_owned(),
))
}
}
}

View file

@ -26,6 +26,7 @@ use crate::{
pub mod add_command; pub mod add_command;
pub mod clean_command; pub mod clean_command;
pub mod edit_command; pub mod edit_command;
pub mod gen_command;
pub mod list_command; pub mod list_command;
crate::create_commands!( crate::create_commands!(
@ -34,6 +35,7 @@ crate::create_commands!(
"List your password and search", List => list_command::List "List your password and search", List => list_command::List
"Clean the password file", Clean => clean_command::Clean "Clean the password file", Clean => clean_command::Clean
"Edit the password content", Edit => edit_command::Edit "Edit the password content", Edit => edit_command::Edit
"Generate password", Gen => gen_command::Gen
// TODO: Remove command // TODO: Remove command
// TODO: Export command // TODO: Export command
// TODO: Import command // TODO: Import command
@ -63,7 +65,7 @@ impl Cli {
"Getting password file: {}", "Getting password file: {}",
passwords_file.to_string_lossy() passwords_file.to_string_lossy()
); );
let password_manager = if matches!(self.command, Commands::Clean(..)) { let password_manager = if matches!(self.command, Commands::Clean(..) | Commands::Gen(..)) {
Passwords { Passwords {
passwords_file, passwords_file,
..Default::default() ..Default::default()