Skip to content
Snippets Groups Projects
inputs.rs 2.50 KiB
use crate::utils::GcliError;
use inquire::validator::Validation;

pub fn prompt_password() -> Result<String, GcliError> {
	prompt_password_query("Password")
}

pub fn prompt_password_confirm() -> Result<String, GcliError> {
	prompt_password_query_confirm("Password")
}

pub fn prompt_password_query(query: impl ToString) -> Result<String, GcliError> {
	inquire::Password::new(query.to_string().as_str())
		.without_confirmation()
		.prompt()
		.map_err(|e| GcliError::Input(e.to_string()))
}

pub fn prompt_seed() -> Result<String, GcliError> {
	inquire::Password::new("Seed:")
		.without_confirmation()
		.with_validator(|input: &str| {
			if input.chars().any(|c| !c.is_ascii_hexdigit()) {
				Ok(Validation::Invalid(
					"Seed value must only contain valid hexadecimal characters [0-9a-fA-F]".into(),
				))
			} else if input.len() < 64 || input.len() > 64 {
				Ok(Validation::Invalid(
					"Seed value must be 32 bytes in hexadecimal format (64 characters long)".into(),
				))
			} else {
				Ok(Validation::Valid)
			}
		})
		.prompt()
		.map_err(|e| GcliError::Input(e.to_string()))
}

pub fn prompt_password_query_confirm(query: impl ToString) -> Result<String, GcliError> {
	inquire::Password::new(query.to_string().as_str())
		.prompt()
		.map_err(|e| GcliError::Input(e.to_string()))
}

/// Prompt for a (direct) vault name (cannot contain derivation path)
///
/// Also preventing to use '<' and '>' as those are used in the display
pub fn prompt_vault_name() -> Result<Option<String>, GcliError> {
	let name = inquire::Text::new("Name:")
		.with_validator(|input: &str| {
			if input.contains('<') || input.contains('>') || input.contains('/') {
				Ok(Validation::Invalid(
					"Name cannot contain characters '<', '>', '/'".into(),
				))
			} else {
				Ok(Validation::Valid)
			}
		})
		.prompt()
		.map_err(|e| GcliError::Input(e.to_string()))?;

	Ok(if name.trim().is_empty() {
		None
	} else {
		Some(name.trim().to_string())
	})
}

/// Prompt for a derivation path
pub fn prompt_vault_derivation_path() -> Result<String, GcliError> {
	inquire::Text::new("Derivation path:")
		.with_validator(|input: &str| {
			if !input.starts_with("/") {
				Ok(Validation::Invalid(
					"derivation path needs to start with one or more '/'".into(),
				))
			} else {
				Ok(Validation::Valid)
			}
		})
		.prompt()
		.map_err(|e| GcliError::Input(e.to_string()))
}

pub fn confirm_action(query: impl ToString) -> Result<bool, GcliError> {
	inquire::Confirm::new(query.to_string().as_str())
		.prompt()
		.map_err(|e| GcliError::Input(e.to_string()))
}