diff --git a/src/cli/add_command.rs b/src/cli/add_command.rs index 5c211c2..2c3a9b3 100644 --- a/src/cli/add_command.rs +++ b/src/cli/add_command.rs @@ -39,30 +39,36 @@ pub struct Add { #[arg(name = "KEY=VALUE", short = 'c', long = "custom")] #[arg(value_parser = clap_parsers::kv_parser)] custom_fields: Vec<(String, String)>, + /// Force add, will not return error if there is a problem with the args. + /// + /// For example, duplication in the custom fields and try to adding empty + /// vault + #[arg(short, long)] + force: bool, } impl LprsCommand for Add { fn run(mut self, mut vault_manager: Vaults) -> LprsResult<()> { - self.vault_info.password = utils::user_password(self.password, "Vault password:")?; - self.vault_info.custom_fields = self.custom_fields.into_iter().collect(); - vault_manager.add_vault(self.vault_info); - vault_manager.try_export() + if !self.vault_info.is_empty() { + self.vault_info.password = utils::user_password(self.password, "Vault password:")?; + self.vault_info.custom_fields = self.custom_fields.into_iter().collect(); + vault_manager.add_vault(self.vault_info); + vault_manager.try_export()?; + } + Ok(()) } fn validate_args(&self) -> LprsResult<()> { - if self.vault_info.username.is_none() - && self.password.is_none() - && self.vault_info.service.is_none() - && self.vault_info.note.is_none() - && self.custom_fields.is_empty() - { + if !self.force && self.vault_info.is_empty() { return Err(LprsError::Other("You can't add empty vault".to_owned())); } if let Some(duplicated_key) = utils::get_duplicated_field(&self.custom_fields) { - return Err(LprsError::Other(format!( - "Duplication error: The custom key `{duplicated_key}` is duplicate" - ))); + if !self.force { + return Err(LprsError::Other(format!( + "Duplication error: The custom key `{duplicated_key}` is duplicate" + ))); + } } Ok(()) diff --git a/src/cli/edit_command.rs b/src/cli/edit_command.rs index d264576..98ec47b 100644 --- a/src/cli/edit_command.rs +++ b/src/cli/edit_command.rs @@ -49,6 +49,11 @@ pub struct Edit { #[arg(name = "KEY=VALUE", short = 'c', long = "custom")] #[arg(value_parser = clap_parsers::kv_parser)] pub custom_fields: Vec<(String, String)>, + /// Force edit, will not return error if there is a problem with the args. + /// + /// For example, duplication in the custom fields and try to editing nothing + #[arg(short, long)] + force: bool, } impl LprsCommand for Edit { @@ -86,7 +91,8 @@ impl LprsCommand for Edit { } fn validate_args(&self) -> LprsResult<()> { - if self.name.is_none() + if !self.force + && self.name.is_none() && self.username.is_none() && self.password.is_none() && self.service.is_none() @@ -98,9 +104,11 @@ impl LprsCommand for Edit { )); } if let Some(duplicated_key) = utils::get_duplicated_field(&self.custom_fields) { - return Err(LprsError::Other(format!( - "Duplication error: The custom key `{duplicated_key}` is duplicate" - ))); + if !self.force { + return Err(LprsError::Other(format!( + "Duplication error: The custom key `{duplicated_key}` is duplicate" + ))); + } } Ok(()) diff --git a/src/vault/mod.rs b/src/vault/mod.rs index 931b317..7c0c022 100644 --- a/src/vault/mod.rs +++ b/src/vault/mod.rs @@ -94,6 +94,15 @@ impl Vault { } } + /// Returns true if the vault is empty + pub fn is_empty(&self) -> bool { + self.username.is_none() + && self.password.is_none() + && self.service.is_none() + && self.note.is_none() + && self.custom_fields.is_empty() + } + /// Return the name of the vault with the service if there pub fn list_name(&self) -> String { use fmt::Write;