From d7d5576195149203f016677c3965d90fd2428fde Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Wed, 1 Nov 2023 00:00:00 +0000 Subject: feat:(cli_interactor) add choice selector add single choice selector as an enabler for selecting pr from a list --- src/cli_interactor.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/cli_interactor.rs b/src/cli_interactor.rs index cf6e3d0..e52cefb 100644 --- a/src/cli_interactor.rs +++ b/src/cli_interactor.rs @@ -1,4 +1,4 @@ -use anyhow::Result; +use anyhow::{Context, Result}; use dialoguer::{theme::ColorfulTheme, Confirm, Input, Password}; #[cfg(test)] use mockall::*; @@ -13,6 +13,7 @@ pub trait InteractorPrompt { fn input(&self, parms: PromptInputParms) -> Result; fn password(&self, parms: PromptPasswordParms) -> Result; fn confirm(&self, params: PromptConfirmParms) -> Result; + fn choice(&self, params: PromptChoiceParms) -> Result; } impl InteractorPrompt for Interactor { fn input(&self, parms: PromptInputParms) -> Result { @@ -37,6 +38,12 @@ impl InteractorPrompt for Interactor { .interact()?; Ok(confirm) } + fn choice(&self, parms: PromptChoiceParms) -> Result { + dialoguer::Select::with_theme(&self.theme) + .items(&parms.choices) + .interact() + .context("failed to get choice") + } } #[derive(Default)] @@ -84,3 +91,20 @@ impl PromptConfirmParms { self } } + +#[derive(Default)] +pub struct PromptChoiceParms { + pub prompt: String, + pub choices: Vec, +} + +impl PromptChoiceParms { + pub fn with_prompt>(mut self, prompt: S) -> Self { + self.prompt = prompt.into(); + self + } + pub fn with_choices(mut self, choices: Vec) -> Self { + self.choices = choices; + self + } +} -- cgit v1.2.3