From d8350e636e733c6d49d46d95e0c3ca6c403d72c5 Mon Sep 17 00:00:00 2001 From: Awiteb Date: Fri, 10 May 2024 18:00:29 +0300 Subject: [PATCH] feat: Ability to edit & remove by name (not index only) --- src/cli/edit_command.rs | 27 ++++++++++++------------ src/cli/remove_command.rs | 43 ++++++++++++++++----------------------- 2 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/cli/edit_command.rs b/src/cli/edit_command.rs index 98ec47b..6586e60 100644 --- a/src/cli/edit_command.rs +++ b/src/cli/edit_command.rs @@ -14,8 +14,6 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use std::num::NonZeroU64; - use clap::Args; use crate::{clap_parsers, utils, vault::Vaults, LprsCommand, LprsError, LprsResult}; @@ -24,8 +22,9 @@ use crate::{clap_parsers, utils, vault::Vaults, LprsCommand, LprsError, LprsResu #[command(author, version, about, long_about = None)] /// Edit command, used to edit the vault content pub struct Edit { - /// The password index. You can get it from the list command - index: NonZeroU64, + /// The vault to edit, index or name + #[arg(name = "INDEX-or-NAME")] + location: String, #[arg(short, long)] /// The new vault name @@ -58,16 +57,16 @@ pub struct Edit { impl LprsCommand for Edit { fn run(self, mut vault_manager: Vaults) -> LprsResult<()> { - let index = self.index.get() as usize; - log::debug!("Editing vault at index: {index}"); - - let Some(vault) = vault_manager.vaults.get_mut(index - 1) else { - return Err(LprsError::InvalidVaultIndex(format!( - "The index `{}` is greater than the vaults count {}", - self.index, - vault_manager.vaults.len() - ))); - }; + let vault = + match utils::vault_by_index_or_name(self.location.trim(), &mut vault_manager.vaults) { + Ok((_, v)) => v, + Err(err) => { + if self.force { + return Ok(()); + } + return Err(err); + } + }; log::info!("Applying the new values to the vault"); if let Some(new_name) = self.name { diff --git a/src/cli/remove_command.rs b/src/cli/remove_command.rs index 8215c29..934573b 100644 --- a/src/cli/remove_command.rs +++ b/src/cli/remove_command.rs @@ -14,44 +14,37 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use std::num::NonZeroU64; - use clap::Args; -use crate::{vault::Vaults, LprsCommand, LprsError, LprsResult}; +use crate::{utils, vault::Vaults, LprsCommand, LprsResult}; #[derive(Debug, Args)] #[command(author, version, about, long_about = None)] /// Remove command, used to remove a vault from the vaults file pub struct Remove { - /// The password index - index: NonZeroU64, + /// The vault to remove, index or name + #[arg(name = "INDEX-or-NAME")] + location: String, - /// Force remove, will not return error if there is no password with this - /// index + /// Force remove, will not return error if there is no vault with the given + /// index or name #[arg(short, long)] force: bool, } impl LprsCommand for Remove { fn run(self, mut vault_manager: Vaults) -> LprsResult<()> { - let index = (self.index.get() - 1) as usize; - log::debug!("Removing vault at index: {index}"); - - if index > vault_manager.vaults.len() { - if self.force { - log::error!( - "The index is greater than the passwords counts, but the force flag is enabled" - ); - } else { - return Err(LprsError::Other( - "The index is greater than the passwords counts".to_owned(), - )); - } - } else { - vault_manager.vaults.remove(index); - vault_manager.try_export()?; - } - Ok(()) + let index = + match utils::vault_by_index_or_name(self.location.trim(), &mut vault_manager.vaults) { + Ok((idx, _)) => idx, + Err(err) => { + if self.force { + return Ok(()); + } + return Err(err); + } + }; + vault_manager.vaults.remove(index); + vault_manager.try_export() } }