From 2303e8920d1a3f48f21b7b7b6217b99b3212b5b3 Mon Sep 17 00:00:00 2001 From: Roland Schaer Date: Thu, 16 May 2024 10:48:32 +0200 Subject: [PATCH] feat: confirm all plugins --- Cargo.lock | 4 ++-- src/plugins/external_plugin.rs | 5 ++++- src/ui/prompt.rs | 38 +++++++++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c27838bf..dc751b8bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -580,9 +580,9 @@ dependencies = [ [[package]] name = "demand" -version = "1.1.2" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda1a13d78ff4cf9c32ab4a4cb331f04c2faea9a515aa8b1081b25a9a853844b" +checksum = "ac0e05015a3ce6c1bf6c356e720577d25637dead76af65a67cfde43009d39e27" dependencies = [ "console", "once_cell", diff --git a/src/plugins/external_plugin.rs b/src/plugins/external_plugin.rs index 60489a62a..a943a3ad7 100644 --- a/src/plugins/external_plugin.rs +++ b/src/plugins/external_plugin.rs @@ -535,7 +535,10 @@ impl Forge for ExternalPlugin { if settings.paranoid { bail!("Paranoid mode is enabled, refusing to install community-developed plugin"); } - if !prompt::confirm(format!("Would you like to install {}?", self.name))? { + if !prompt::confirm_with_all(format!( + "Would you like to install {}?", + self.name + ))? { Err(PluginNotInstalled(self.name.clone()))? } } diff --git a/src/ui/prompt.rs b/src/ui/prompt.rs index 804505784..8b4f0dde6 100644 --- a/src/ui/prompt.rs +++ b/src/ui/prompt.rs @@ -1,12 +1,14 @@ use std::sync::Mutex; -use demand::Confirm; +use demand::{Confirm, Dialog, DialogButton}; use crate::env; use crate::ui::ctrlc; static MUTEX: Mutex<()> = Mutex::new(()); +static SKIP_PROMPT: Mutex = Mutex::new(false); + pub fn confirm>(message: S) -> eyre::Result { let _lock = MUTEX.lock().unwrap(); // Prevent multiple prompts at once let _ctrlc = ctrlc::handle_ctrlc()?; @@ -17,3 +19,37 @@ pub fn confirm>(message: S) -> eyre::Result { let result = Confirm::new(message).run()?; Ok(result) } + +pub fn confirm_with_all>(message: S) -> eyre::Result { + let _lock = MUTEX.lock().unwrap(); // Prevent multiple prompts at once + let _ctrlc = ctrlc::handle_ctrlc()?; + + if !console::user_attended_stderr() || env::__USAGE.is_some() { + return Ok(false); + } + + let mut skip_prompt = SKIP_PROMPT.lock().unwrap(); + if *skip_prompt { + return Ok(true); + } + + let answer = Dialog::new(message) + .buttons(vec![ + DialogButton::new("Yes"), + DialogButton::new("No"), + DialogButton::new("All"), + ]) + .selected_button(1) + .run()?; + + let result = match answer.as_str() { + "Yes" => true, + "No" => false, + "All" => { + *skip_prompt = true; + true + } + _ => false, + }; + Ok(result) +}