From 747e02daf39e1a5f0c4f654c13a968b59c9d6a00 Mon Sep 17 00:00:00 2001 From: Nicolas80 <nicolas.pmail@protonmail.com> Date: Sun, 29 Dec 2024 13:48:03 +0100 Subject: [PATCH] Reusing `inquire` dependency (which I didn't see in the first place) for user inputs * Had to bump up the dependency since version 0.6.2 had a bug for the password confirmation - see https://github.com/mikaelmello/inquire/issues/149 * Removed `dialoguer` dependency * We may want to replace all `rpassword` usage with `inquire` in the future --- Cargo.lock | 82 ++++++++++++++++++--------------------------------- Cargo.toml | 3 +- src/inputs.rs | 78 ++++++++++++++++++------------------------------ 3 files changed, 57 insertions(+), 106 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b94f02f..aa5fa37 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1214,7 +1214,7 @@ dependencies = [ "crossterm 0.27.0", "strum", "strum_macros", - "unicode-width 0.1.14", + "unicode-width", ] [[package]] @@ -1260,19 +1260,6 @@ dependencies = [ "toml 0.5.11", ] -[[package]] -name = "console" -version = "0.15.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" -dependencies = [ - "encode_unicode", - "libc", - "once_cell", - "unicode-width 0.2.0", - "windows-sys 0.59.0", -] - [[package]] name = "const-oid" version = "0.9.6" @@ -1667,19 +1654,6 @@ dependencies = [ "syn 2.0.87", ] -[[package]] -name = "dialoguer" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" -dependencies = [ - "console", - "shell-words", - "tempfile", - "thiserror", - "zeroize", -] - [[package]] name = "digest" version = "0.9.0" @@ -1918,12 +1892,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - [[package]] name = "encoding_rs" version = "0.8.34" @@ -2350,6 +2318,24 @@ dependencies = [ "slab", ] +[[package]] +name = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "gcli" version = "0.3.0" @@ -2362,7 +2348,6 @@ dependencies = [ "colored", "comfy-table", "confy", - "dialoguer", "directories 5.0.1", "env_logger", "futures", @@ -2949,18 +2934,19 @@ dependencies = [ [[package]] name = "inquire" -version = "0.6.2" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33e7c1ddeb15c9abcbfef6029d8e29f69b52b6d6c891031b88ed91b5065803b" +checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.6.0", "crossterm 0.25.0", "dyn-clone", - "lazy_static", + "fuzzy-matcher", + "fxhash", "newline-converter", - "thiserror", + "once_cell", "unicode-segmentation", - "unicode-width 0.1.14", + "unicode-width", ] [[package]] @@ -3575,9 +3561,9 @@ dependencies = [ [[package]] name = "newline-converter" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f71d09d5c87634207f894c6b31b6a2b2c64ea3bdcf71bd5599fdbbe1600c00f" +checksum = "47b6b097ecb1cbfed438542d16e84fd7ad9b0c76c8a65b7f9039212a3d14dc7f" dependencies = [ "unicode-segmentation", ] @@ -5413,12 +5399,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - [[package]] name = "shlex" version = "1.3.0" @@ -7108,12 +7088,6 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" -[[package]] -name = "unicode-width" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" - [[package]] name = "unicode-xid" version = "0.2.6" diff --git a/Cargo.toml b/Cargo.toml index 272280b..9a52f00 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,14 +36,13 @@ log = "^0.4.22" reqwest = { version = "^0.11.27", default-features = false, features = [ "rustls-tls", ] } +inquire = "^0.7.5" rpassword = "^7.3.1" -dialoguer = "0.11.0" serde = { version = "^1.0", features = ["derive"] } serde_json = "^1.0.128" tokio = { version = "^1.40.0", features = ["macros"] } confy = "^0.5.1" bs58 = "^0.5.1" -inquire = "^0.6.2" directories = "^5.0.1" comfy-table = "^7.1.1" sea-orm = { version = "1.1.0", features = [ "sqlx-sqlite", "runtime-tokio-native-tls", "macros" ] } diff --git a/src/inputs.rs b/src/inputs.rs index 1eb188e..acbe331 100644 --- a/src/inputs.rs +++ b/src/inputs.rs @@ -1,4 +1,5 @@ use crate::utils::GcliError; +use inquire::validator::Validation; pub fn prompt_password() -> Result<String, GcliError> { prompt_password_query("Password") @@ -9,22 +10,15 @@ pub fn prompt_password_confirm() -> Result<String, GcliError> { } pub fn prompt_password_query(query: impl ToString) -> Result<String, GcliError> { - dialoguer::Password::default() - .with_prompt(query.to_string()) - .allow_empty_password(true) - .interact() + inquire::Password::new(query.to_string().as_str()) + .without_confirmation() + .prompt() .map_err(|e| GcliError::Input(e.to_string())) } pub fn prompt_password_query_confirm(query: impl ToString) -> Result<String, GcliError> { - dialoguer::Password::new() - .with_prompt(query.to_string()) - .allow_empty_password(true) - .with_confirmation( - format!("Repeat {}", query.to_string()), - "Error: the values do not match.", - ) - .interact() + inquire::Password::new(query.to_string().as_str()) + .prompt() .map_err(|e| GcliError::Input(e.to_string())) } @@ -32,54 +26,38 @@ pub fn prompt_password_query_confirm(query: impl ToString) -> Result<String, Gcl /// /// Also preventing to use '<' and '>' as those are used in the display of pub fn prompt_vault_name() -> Result<Option<String>, GcliError> { - let name = dialoguer::Input::new() - .with_prompt("Name") - .validate_with({ - move |input: &String| -> Result<(), &str> { - if input.contains('<') || input.contains('>') || input.contains('/') { - Err("Name cannot contain characters '<', '>', '/'") - } else { - Ok(()) - } + 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) } }) - .allow_empty(true) - .interact_text() - .map_err(|e| GcliError::Input(e.to_string()))?; - - let name = if name.trim().is_empty() { - None - } else { - Some(name.trim().to_string()) - }; - - Ok(name) + .prompt_skippable() + .map_err(|e| GcliError::Input(e.to_string())) } /// Prompt for a derivation path pub fn prompt_vault_derivation_path() -> Result<String, GcliError> { - let path = dialoguer::Input::new() - .with_prompt("Derivation path") - .validate_with({ - move |input: &String| -> Result<(), &str> { - if !input.starts_with("/") { - Err("derivation path needs to start with one or more '/'") - } else { - Ok(()) - } + 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) } }) - .allow_empty(false) - .interact_text() - .map_err(|e| GcliError::Input(e.to_string()))?; - - Ok(path) + .prompt() + .map_err(|e| GcliError::Input(e.to_string())) } pub fn confirm_action(query: impl ToString) -> Result<bool, GcliError> { - dialoguer::Confirm::new() - .with_prompt(query.to_string()) - //.default(false) - .interact() + inquire::Confirm::new(query.to_string().as_str()) + .prompt() .map_err(|e| GcliError::Input(e.to_string())) } -- GitLab