From 782aaa8ff81210b20fdd45e99d6398e0bf35fdad Mon Sep 17 00:00:00 2001 From: Aurelia Date: Fri, 17 Jan 2025 10:43:59 +0100 Subject: [PATCH] [CLI] Use Fuzzy selct instead of select. --- Cargo.lock | 20 ++++++++++++++++ cli/Cargo.toml | 2 +- cli/src/commands/invite/claim.rs | 6 ++--- cli/src/utils.rs | 6 ++--- cli/tests/integration/invitations/device.rs | 9 ++++---- .../invitations/shared_recovery.rs | 16 +++++-------- cli/tests/integration/invitations/user.rs | 11 ++++----- cli/tests/integration/mod.rs | 23 ------------------- 8 files changed, 42 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a637b3b1e8d..3161d6c59ea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -926,6 +926,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" dependencies = [ "console", + "fuzzy-matcher", "shell-words", "thiserror", ] @@ -1354,6 +1355,15 @@ 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 = "generic-array" version = "0.14.7" @@ -4386,6 +4396,16 @@ dependencies = [ "syn 2.0.95", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if 1.0.0", + "once_cell", +] + [[package]] name = "time" version = "0.3.36" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 2297c340f67..daf89bf3e6c 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -28,7 +28,7 @@ libparsec_platform_ipc = { workspace = true } anyhow = { workspace = true } clap = { workspace = true, features = ["default", "derive", "env"] } -dialoguer = { workspace = true } +dialoguer = { workspace = true, features = ["fuzzy-select"] } env_logger = { workspace = true, features = ["auto-color", "humantime", "regex"] } log = { workspace = true } reqwest = { workspace = true, features = ["json"] } diff --git a/cli/src/commands/invite/claim.rs b/cli/src/commands/invite/claim.rs index 1502c7457a0..8f8cf83c4c6 100644 --- a/cli/src/commands/invite/claim.rs +++ b/cli/src/commands/invite/claim.rs @@ -21,7 +21,7 @@ use libparsec_client::{ }; use crate::utils::*; -use dialoguer::{Input, Select}; +use dialoguer::{FuzzySelect, Input}; crate::clap_parser_with_shared_opts_builder!( #[with = config_dir, data_dir, password_stdin] @@ -105,7 +105,7 @@ pub async fn main(args: Args) -> anyhow::Result<()> { let ctx = step5_shamir(device_ctx).await?; match ctx { ShamirRecoveryClaimMaybeFinalizeCtx::Offline(ctx) => { - let retry = Select::new() + let retry = FuzzySelect::new() .default(0) .with_prompt("Unable to join server, do you want to retry ?") .items(&["yes", "no"]) @@ -170,7 +170,7 @@ fn shamir_pick_recipient( .fold(0_u8, |acc, (_, s)| acc + u8::from(*s)) ); } - let selection = Select::new() + let selection = FuzzySelect::new() .default(0) .with_prompt("Choose a person to contact now") .items(&human_recipients) diff --git a/cli/src/utils.rs b/cli/src/utils.rs index e4e42b230ae..5dfd3ef0a3e 100644 --- a/cli/src/utils.rs +++ b/cli/src/utils.rs @@ -3,7 +3,7 @@ use std::{fmt::Display, ops::Deref, path::Path, sync::Arc}; use anyhow::anyhow; -use dialoguer::Select; +use dialoguer::FuzzySelect; use libparsec::{ internal::{Client, EventBus}, list_available_devices, AuthenticatedCmds, AvailableDevice, DeviceAccessStrategy, @@ -404,7 +404,7 @@ pub fn choose_sas_code( expected: &SASCode, provided_by: &str, ) -> anyhow::Result<()> { - let selected_sas = Select::new() + let selected_sas = FuzzySelect::new() .default(0) .items(sas_codes) .with_prompt(format!("Select code provided by {provided_by}")) @@ -421,7 +421,7 @@ pub fn choose_user_profile() -> anyhow::Result { UserProfile::Admin, UserProfile::Outsider, ]; - let selected_profile = Select::new() + let selected_profile = FuzzySelect::new() .default(0) .items(&profiles) .with_prompt("Which profile?") diff --git a/cli/tests/integration/invitations/device.rs b/cli/tests/integration/invitations/device.rs index 88662f111d1..3637bd22dcb 100644 --- a/cli/tests/integration/invitations/device.rs +++ b/cli/tests/integration/invitations/device.rs @@ -8,7 +8,6 @@ use rexpect::spawn; use crate::{ integration_tests::bootstrap_cli_test, - match_sas_code, testenv_utils::{TestOrganization, DEFAULT_DEVICE_PASSWORD}, }; @@ -107,7 +106,7 @@ async fn invite_device_dance(tmp_path: TmpPath) { let mut locked = claimer_cloned.lock().unwrap(); locked - .exp_string("Select code provided by greeter:") + .exp_string("Select code provided by greeter") .unwrap(); }); greeter.await.unwrap(); @@ -126,7 +125,7 @@ async fn invite_device_dance(tmp_path: TmpPath) { { let mut locked = cloned_claimer.lock().unwrap(); - match_sas_code!(locked, sas_code); + locked.send_line(&sas_code).unwrap(); } // retrieve claimer code @@ -135,7 +134,7 @@ async fn invite_device_dance(tmp_path: TmpPath) { let mut locked = greeter_cloned.lock().unwrap(); locked.exp_string("Waiting for claimer").unwrap(); locked - .exp_string("Select code provided by claimer:") + .exp_string("Select code provided by claimer") .unwrap(); }); @@ -153,7 +152,7 @@ async fn invite_device_dance(tmp_path: TmpPath) { { let mut locked = greeter_cloned.lock().unwrap(); - match_sas_code!(locked, sas_code); + locked.send_line(&sas_code).unwrap(); locked .exp_string(&format!("Select code provided by claimer: {sas_code}")) .unwrap(); diff --git a/cli/tests/integration/invitations/shared_recovery.rs b/cli/tests/integration/invitations/shared_recovery.rs index c86876ca580..7aa08d11b46 100644 --- a/cli/tests/integration/invitations/shared_recovery.rs +++ b/cli/tests/integration/invitations/shared_recovery.rs @@ -8,7 +8,6 @@ use rexpect::{session::PtySession, spawn}; use crate::{ integration_tests::{bootstrap_cli_test, shared_recovery_create}, - match_sas_code, testenv_utils::{TestOrganization, DEFAULT_DEVICE_PASSWORD}, }; @@ -95,14 +94,11 @@ async fn invite_shared_recovery_dance(tmp_path: TmpPath) { let claimer = tokio::task::spawn(async move { let mut locked = claimer_cloned.lock().unwrap(); - locked - .exp_string("Choose a person to contact now:") - .unwrap(); - // down to choose bob - locked.send_line("j").unwrap(); + locked.exp_string("Choose a person to contact now").unwrap(); + locked.send_line("bob").unwrap(); locked - .exp_string("Select code provided by greeter:") + .exp_string("Select code provided by greeter") .unwrap(); }); greeter.await.unwrap(); @@ -121,7 +117,7 @@ async fn invite_shared_recovery_dance(tmp_path: TmpPath) { { let mut locked = cloned_claimer.lock().unwrap(); - match_sas_code!(locked, sas_code); + locked.send_line(&sas_code).unwrap(); } // retrieve claimer code @@ -130,7 +126,7 @@ async fn invite_shared_recovery_dance(tmp_path: TmpPath) { let mut locked = greeter_cloned.lock().unwrap(); locked.exp_string("Waiting for claimer").unwrap(); locked - .exp_string("Select code provided by claimer:") + .exp_string("Select code provided by claimer") .unwrap(); }); @@ -146,7 +142,7 @@ async fn invite_shared_recovery_dance(tmp_path: TmpPath) { { let mut locked = p_greeter.lock().unwrap(); - match_sas_code!(locked, sas_code); + locked.send_line(&sas_code).unwrap(); } let mut greeter = Arc::>::try_unwrap(p_greeter) .ok() diff --git a/cli/tests/integration/invitations/user.rs b/cli/tests/integration/invitations/user.rs index cfe9355b20f..6db85282baa 100644 --- a/cli/tests/integration/invitations/user.rs +++ b/cli/tests/integration/invitations/user.rs @@ -8,7 +8,6 @@ use rexpect::spawn; use crate::{ integration_tests::bootstrap_cli_test, - match_sas_code, testenv_utils::{TestOrganization, DEFAULT_DEVICE_PASSWORD}, utils::YELLOW, }; @@ -120,7 +119,7 @@ async fn invite_user_dance(tmp_path: TmpPath) { let mut locked = claimer_cloned.lock().unwrap(); locked - .exp_string("Select code provided by greeter:") + .exp_string("Select code provided by greeter") .unwrap(); }); greeter.await.unwrap(); @@ -139,7 +138,7 @@ async fn invite_user_dance(tmp_path: TmpPath) { { let mut locked = cloned_claimer.lock().unwrap(); - match_sas_code!(locked, sas_code); + locked.send_line(&sas_code).unwrap(); } // retrieve claimer code @@ -148,7 +147,7 @@ async fn invite_user_dance(tmp_path: TmpPath) { let mut locked = greeter_cloned.lock().unwrap(); locked.exp_string("Waiting for claimer").unwrap(); locked - .exp_string("Select code provided by claimer:") + .exp_string("Select code provided by claimer") .unwrap(); }); @@ -166,7 +165,7 @@ async fn invite_user_dance(tmp_path: TmpPath) { { let mut locked = greeter_cloned.lock().unwrap(); - match_sas_code!(locked, sas_code); + locked.send_line(&sas_code).unwrap(); locked .exp_string(&format!("Select code provided by claimer: {sas_code}")) .unwrap(); @@ -191,7 +190,7 @@ async fn invite_user_dance(tmp_path: TmpPath) { .exp_string("New user: [alice2 ]") .unwrap(); locked.exp_string("Which profile?").unwrap(); - locked.send_line("\n").unwrap(); // selection on standard by default + locked.send_line("standard").unwrap(); locked .exp_string("Creating the user in the server") diff --git a/cli/tests/integration/mod.rs b/cli/tests/integration/mod.rs index 60dd020d6c5..a611cb1c7d0 100644 --- a/cli/tests/integration/mod.rs +++ b/cli/tests/integration/mod.rs @@ -146,29 +146,6 @@ macro_rules! assert_cmd_failure { } } -#[macro_export] -macro_rules! match_sas_code { - ($locked:ident, $sas_code:ident) => { - $locked.read_line().unwrap(); //empty line - let first = dbg!($locked.read_line().unwrap()); - let second = dbg!($locked.read_line().unwrap()); - let third = dbg!($locked.read_line().unwrap()); - - if $sas_code == first[first.len() - 4..] { - dbg!("first"); - $locked.send_line("").unwrap(); - } else if $sas_code == second[second.len() - 4..] { - dbg!("second"); - $locked.send_line("j").unwrap(); - } else if $sas_code == third[third.len() - 4..] { - dbg!("third"); - $locked.send_line("jj").unwrap(); - } else { - panic!("no corresponding sas code available") - } - }; -} - /// For Alice, with Bob and Toto as recipients fn shared_recovery_create( alice: &Arc,