From bf8e6ca36a130f6cca81bb6e91a9f5b83624f1bf Mon Sep 17 00:00:00 2001 From: Awiteb Date: Tue, 20 Aug 2024 17:01:11 +0000 Subject: [PATCH] feat: Support removing multiple vaults in single command Signed-off-by: Awiteb --- src/cli/remove_command.rs | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/cli/remove_command.rs b/src/cli/remove_command.rs index d0a904d..7281e0c 100644 --- a/src/cli/remove_command.rs +++ b/src/cli/remove_command.rs @@ -19,14 +19,20 @@ use std::num::NonZeroUsize; use clap::Args; use either::Either; -use crate::{clap_parsers::either_parser, utils, vault::Vaults, LprsCommand, LprsResult}; +use crate::{ + clap_parsers::either_parser, + utils, + vault::{Vault, Vaults}, + LprsCommand, + LprsResult, +}; #[derive(Debug, Args)] /// Remove command, used to remove a vault from the vaults file pub struct Remove { - /// The vault to remove, index or name + /// The vaults to remove, index or name #[arg(name = "INDEX-or-NAME", value_parser = either_parser::)] - location: Either, + locations: Vec>, /// Force remove, will not return error if there is no vault with the given /// index or name @@ -36,16 +42,26 @@ pub struct Remove { impl LprsCommand for Remove { fn run(self, mut vault_manager: Vaults) -> LprsResult<()> { - let index = match utils::vault_by_index_or_name(self.location, &mut vault_manager.vaults) { - Ok((idx, _)) => idx, + let indexes = self + .locations + .iter() + .map(|location| { + utils::vault_by_index_or_name(location, &mut vault_manager.vaults) + .map(|(_, v)| v.clone()) + }) + .collect::>>(); + + match indexes { + Ok(indexes) => vault_manager.vaults.retain(|v| !indexes.contains(v)), Err(err) => { if self.force { + log::warn!("Ignoring error: {err}"); return Ok(()); } return Err(err); } - }; - vault_manager.vaults.remove(index); + } + vault_manager.try_export() } }