use {
crate::{
ci::{interactive_message, is_ci},
ui::fail_message,
},
anyhow::{anyhow, Result},
dialoguer::{console::Term, theme::ColorfulTheme, Confirm, Input, Password, Select},
};
fn ci_required(what: &str) -> anyhow::Error {
anyhow!(fail_message(&interactive_message(what)))
}
fn io_error(err: dialoguer::Error) -> anyhow::Error {
anyhow!(fail_message(&format!("Prompt failed: {err}")))
}
pub fn confirm(prompt: &str, default: bool) -> Result<bool> {
if is_ci() {
return Ok(default);
}
Confirm::with_theme(&ColorfulTheme::default())
.with_prompt(prompt)
.default(default)
.interact()
.map_err(io_error)
}
pub fn input(prompt: &str, default: &str) -> Result<String> {
if is_ci() {
return Ok(default.to_string());
}
Input::<String>::with_theme(&ColorfulTheme::default())
.with_prompt(prompt)
.default(default.to_string())
.interact()
.map_err(io_error)
}
pub fn input_optional(prompt: &str, default: &str) -> Result<String> {
if is_ci() {
return Ok(default.to_string());
}
Input::<String>::with_theme(&ColorfulTheme::default())
.with_prompt(prompt)
.default(default.to_string())
.allow_empty(true)
.interact()
.map_err(io_error)
}
pub fn input_required(prompt: &str) -> Result<String> {
if is_ci() {
return Err(ci_required(prompt));
}
Input::<String>::with_theme(&ColorfulTheme::default())
.with_prompt(prompt)
.interact()
.map_err(io_error)
}
pub fn password(prompt: &str) -> Result<String> {
if is_ci() {
return Err(ci_required(prompt));
}
Password::with_theme(&ColorfulTheme::default())
.with_prompt(prompt)
.interact()
.map_err(io_error)
}
pub fn select<T: ToString>(
prompt: &str,
items: &[T],
default: usize,
ci_default: Option<usize>,
) -> Result<usize> {
if is_ci() {
return ci_default.ok_or_else(|| ci_required(prompt));
}
Select::with_theme(&ColorfulTheme::default())
.with_prompt(prompt)
.items(items)
.default(default)
.interact_on(&Term::stderr())
.map_err(io_error)
}
pub fn select_opt<T: ToString>(
prompt: &str,
items: &[T],
default: usize,
ci_default: Option<usize>,
) -> Result<Option<usize>> {
if is_ci() {
return Ok(Some(ci_default.ok_or_else(|| ci_required(prompt))?));
}
Select::with_theme(&ColorfulTheme::default())
.with_prompt(prompt)
.items(items)
.default(default)
.interact_on_opt(&Term::stderr())
.map_err(io_error)
}