From 5874ea396371013535e3532cc1a7c73d9b103d4a Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Tue, 8 Apr 2025 15:57:22 -0400 Subject: [PATCH 01/23] Add new harmony_cli sub-crate --- Cargo.lock | 34 ++++++++++++++++++++++++++++++++++ Cargo.toml | 9 +++++---- harmony_cli/Cargo.toml | 9 +++++++++ harmony_cli/src/main.rs | 3 +++ 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 harmony_cli/Cargo.toml create mode 100644 harmony_cli/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index f9c279f..f047624 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -371,6 +371,33 @@ dependencies = [ "inout", ] +[[package]] +name = "clap" +version = "4.5.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + [[package]] name = "color-eyre" version = "0.6.3" @@ -1166,6 +1193,13 @@ dependencies = [ "uuid", ] +[[package]] +name = "harmony_cli" +version = "0.1.0" +dependencies = [ + "clap", +] + [[package]] name = "harmony_macros" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index c36cd27..4ba83eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ members = [ "harmony_tui", "opnsense-config", "opnsense-config-xml", + "harmony_cli", ] [workspace.package] @@ -28,7 +29,7 @@ russh-keys = "0.45.0" rand = "0.8.5" url = "2.5.4" kube = "0.98.0" -k8s-openapi = { version = "0.24.0", features = [ "v1_30" ] } +k8s-openapi = { version = "0.24.0", features = ["v1_30"] } serde_yaml = "0.9.34" serde-value = "0.7.0" http = "1.2.0" @@ -36,7 +37,7 @@ http = "1.2.0" [workspace.dependencies.uuid] version = "1.11.0" features = [ - "v4", # Lets you generate random UUIDs - "fast-rng", # Use a faster (but still sufficiently random) RNG - "macro-diagnostics", # Enable better diagnostics for compile-time UUIDs + "v4", # Lets you generate random UUIDs + "fast-rng", # Use a faster (but still sufficiently random) RNG + "macro-diagnostics", # Enable better diagnostics for compile-time UUIDs ] diff --git a/harmony_cli/Cargo.toml b/harmony_cli/Cargo.toml new file mode 100644 index 0000000..a838eda --- /dev/null +++ b/harmony_cli/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "harmony_cli" +edition = "2024" +version.workspace = true +readme.workspace = true +license.workspace = true + +[dependencies] +clap = "4.5.35" diff --git a/harmony_cli/src/main.rs b/harmony_cli/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/harmony_cli/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} -- 2.39.5 From 20a8f121602526efe3255c0a814c5deb485f6250 Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Thu, 10 Apr 2025 12:39:16 -0400 Subject: [PATCH 02/23] WIP --- Cargo.lock | 14 ++++++++++++++ harmony_cli/Cargo.toml | 3 ++- harmony_cli/src/main.rs | 28 ++++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f047624..a287efe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -378,6 +378,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" dependencies = [ "clap_builder", + "clap_derive", ] [[package]] @@ -392,6 +393,18 @@ dependencies = [ "strsim", ] +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "clap_lex" version = "0.7.4" @@ -1198,6 +1211,7 @@ name = "harmony_cli" version = "0.1.0" dependencies = [ "clap", + "harmony", ] [[package]] diff --git a/harmony_cli/Cargo.toml b/harmony_cli/Cargo.toml index a838eda..04d4b66 100644 --- a/harmony_cli/Cargo.toml +++ b/harmony_cli/Cargo.toml @@ -6,4 +6,5 @@ readme.workspace = true license.workspace = true [dependencies] -clap = "4.5.35" +clap = { version = "4.5.35", features = ["derive"] } +harmony = { path = "../harmony" } diff --git a/harmony_cli/src/main.rs b/harmony_cli/src/main.rs index e7a11a9..3da1986 100644 --- a/harmony_cli/src/main.rs +++ b/harmony_cli/src/main.rs @@ -1,3 +1,27 @@ -fn main() { - println!("Hello, world!"); +use clap::Parser; +use harmony; + +#[derive(Parser, Debug)] +#[command(version, about, long_about = None)] +struct Args { + /// Name of score to run + #[arg(short, long)] + run: String, + + /// Run interactive or not + #[arg(short, long, default_value_t = false)] + interactive: bool, + + /// Run all or first + #[arg(short, long, default_value_t = false)] + all: bool, + + /// Run nth matching + #[arg(short, long, default_value_t = 1)] + number: u8, } + +#[harmony::main] +pub async fn main(maestro: harmony::maestro::Maestro) { + maestro. +} \ No newline at end of file -- 2.39.5 From fbea2a40c3b42ccc2405816e4d7bdb7b15f5f2a1 Mon Sep 17 00:00:00 2001 From: tahahawa Date: Fri, 11 Apr 2025 15:19:48 -0400 Subject: [PATCH 03/23] Get example working --- Cargo.lock | 16 ++++++++ examples/cli/Cargo.toml | 18 ++++++++ examples/cli/src/main.rs | 20 +++++++++ harmony_cli/Cargo.toml | 5 +++ harmony_cli/src/lib.rs | 88 ++++++++++++++++++++++++++++++++++++++++ harmony_cli/src/main.rs | 27 ------------ 6 files changed, 147 insertions(+), 27 deletions(-) create mode 100644 examples/cli/Cargo.toml create mode 100644 examples/cli/src/main.rs create mode 100644 harmony_cli/src/lib.rs delete mode 100644 harmony_cli/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index a287efe..9619e3e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -838,6 +838,21 @@ dependencies = [ name = "example" version = "0.0.0" +[[package]] +name = "example-cli" +version = "0.1.0" +dependencies = [ + "cidr", + "env_logger", + "harmony", + "harmony_cli", + "harmony_macros", + "harmony_types", + "log", + "tokio", + "url", +] + [[package]] name = "example-kube-rs" version = "0.1.0" @@ -1212,6 +1227,7 @@ version = "0.1.0" dependencies = [ "clap", "harmony", + "harmony_tui", ] [[package]] diff --git a/examples/cli/Cargo.toml b/examples/cli/Cargo.toml new file mode 100644 index 0000000..0b46a64 --- /dev/null +++ b/examples/cli/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "example-cli" +edition = "2024" +version.workspace = true +readme.workspace = true +license.workspace = true +publish = false + +[dependencies] +harmony = { path = "../../harmony" } +harmony_cli = { path = "../../harmony_cli" } +harmony_types = { path = "../../harmony_types" } +cidr = { workspace = true } +tokio = { workspace = true } +harmony_macros = { path = "../../harmony_macros" } +log = { workspace = true } +env_logger = { workspace = true } +url = { workspace = true } diff --git a/examples/cli/src/main.rs b/examples/cli/src/main.rs new file mode 100644 index 0000000..b7b58f4 --- /dev/null +++ b/examples/cli/src/main.rs @@ -0,0 +1,20 @@ +use harmony::{ + inventory::Inventory, + maestro::Maestro, + modules::dummy::{ErrorScore, PanicScore, SuccessScore}, + topology::HAClusterTopology, +}; + +#[tokio::main] +async fn main() { + let inventory = Inventory::autoload(); + let topology = HAClusterTopology::autoload(); + let mut maestro = Maestro::new(inventory, topology); + + maestro.register_all(vec![ + Box::new(SuccessScore {}), + Box::new(ErrorScore {}), + Box::new(PanicScore {}), + ]); + harmony_cli::init(maestro).await.unwrap(); +} diff --git a/harmony_cli/Cargo.toml b/harmony_cli/Cargo.toml index 04d4b66..ee8ccc2 100644 --- a/harmony_cli/Cargo.toml +++ b/harmony_cli/Cargo.toml @@ -8,3 +8,8 @@ license.workspace = true [dependencies] clap = { version = "4.5.35", features = ["derive"] } harmony = { path = "../harmony" } +harmony_tui = { path = "../harmony_tui", optional = true } + + +[features] +tui = ["dep:harmony_tui"] diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs new file mode 100644 index 0000000..a470822 --- /dev/null +++ b/harmony_cli/src/lib.rs @@ -0,0 +1,88 @@ +use clap::Parser; +use clap::builder::ArgPredicate; +use harmony; +use harmony::{score::Score, topology::Topology}; + +#[cfg(feature = "tui")] +use harmony_tui; + +#[derive(Parser, Debug)] +#[command(version, about, long_about = None)] +struct Args { + /// Name of score to run + #[cfg(feature = "tui")] + #[arg( + short, + long, + default_value_if("interactive", ArgPredicate::IsPresent, Some("unused")) + )] + run: String, + + /// Name of score to run + #[cfg(not(feature = "tui"))] + #[arg(short, long)] + run: String, + + /// Run interactive or not + #[arg(short, long, default_value_t = false)] + interactive: bool, + + /// Run all or nth + #[arg(short, long, default_value_t = false)] + all: bool, + + /// Run nth matching, zero indexed + #[arg(short, long, default_value_t = 0)] + number: u8, +} + +pub async fn init( + maestro: harmony::maestro::Maestro, +) -> Result<(), Box> { + let args = Args::parse(); + + #[cfg(feature = "tui")] + if args.interactive { + return harmony_tui::init(maestro).await; + } + + #[cfg(not(feature = "tui"))] + if args.interactive { + return Err("Not compiled with interactive support".into()); + } + + let scores = maestro.scores(); + let scores_read = scores.read().expect("Should be able to read scores"); + let scores_read_vec: Vec>> = + scores_read.iter().map(|s| s.clone_box()).collect(); + + if args.all { + for s in scores_read_vec { + if s.name().contains(&args.run) { + println!("Running: {}", s.clone_box().name()); + } + } + } else { + let mut count = 0; + let mut found = false; + for s in scores_read_vec { + if s.name().contains(&args.run) { + found = true; + if count < args.number { + // Skip scores that aren't the nth specified + count = count + 1; + continue; + } else { + // Run nth score found + println!("Running: {}", s.clone_box().name()); + break; + } + } + } + if !found { + println!("Couldn't find score by that name") + } + } + + return Ok(()); +} diff --git a/harmony_cli/src/main.rs b/harmony_cli/src/main.rs deleted file mode 100644 index 3da1986..0000000 --- a/harmony_cli/src/main.rs +++ /dev/null @@ -1,27 +0,0 @@ -use clap::Parser; -use harmony; - -#[derive(Parser, Debug)] -#[command(version, about, long_about = None)] -struct Args { - /// Name of score to run - #[arg(short, long)] - run: String, - - /// Run interactive or not - #[arg(short, long, default_value_t = false)] - interactive: bool, - - /// Run all or first - #[arg(short, long, default_value_t = false)] - all: bool, - - /// Run nth matching - #[arg(short, long, default_value_t = 1)] - number: u8, -} - -#[harmony::main] -pub async fn main(maestro: harmony::maestro::Maestro) { - maestro. -} \ No newline at end of file -- 2.39.5 From 8cc588013503f1e215841090e439659dd6334066 Mon Sep 17 00:00:00 2001 From: tahahawa Date: Fri, 11 Apr 2025 16:13:21 -0400 Subject: [PATCH 04/23] refactor with iter and filter --- harmony_cli/src/lib.rs | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index a470822..dc125fe 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -55,32 +55,24 @@ pub async fn init( let scores_read = scores.read().expect("Should be able to read scores"); let scores_read_vec: Vec>> = scores_read.iter().map(|s| s.clone_box()).collect(); + let filtered: Vec<&Box>> = scores_read_vec + .iter() + .filter(|s| s.name().contains(&args.run)) + .collect(); + + if filtered.len() == 0 { + return Err("No score containing query found".into()); + } if args.all { - for s in scores_read_vec { - if s.name().contains(&args.run) { - println!("Running: {}", s.clone_box().name()); - } + for s in filtered { + println!("Running: {}", s.clone_box().name()); } } else { - let mut count = 0; - let mut found = false; - for s in scores_read_vec { - if s.name().contains(&args.run) { - found = true; - if count < args.number { - // Skip scores that aren't the nth specified - count = count + 1; - continue; - } else { - // Run nth score found - println!("Running: {}", s.clone_box().name()); - break; - } - } - } - if !found { - println!("Couldn't find score by that name") + let score = filtered.get(args.number as usize); + match score { + Some(s) => println!("Running: {}", s.clone_box().name()), + None => return Err("Invalid index given".into()), } } -- 2.39.5 From 83355e140ad4acb0bfc5178d3a0e83aadfccb2d5 Mon Sep 17 00:00:00 2001 From: tahahawa Date: Fri, 11 Apr 2025 16:14:42 -0400 Subject: [PATCH 05/23] more idiomatic Ok --- harmony_cli/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index dc125fe..41894ab 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -76,5 +76,5 @@ pub async fn init( } } - return Ok(()); + Ok(()) } -- 2.39.5 From 49b39f403b2b0faedaf3b1e78ce13baced803673 Mon Sep 17 00:00:00 2001 From: tahahawa Date: Fri, 11 Apr 2025 17:03:09 -0400 Subject: [PATCH 06/23] add assert_cmd to test binaries --- Cargo.lock | 82 ++++++++++++++++++++++++++++++++++++++++ examples/cli/Cargo.toml | 1 + examples/cli/src/main.rs | 10 +++++ 3 files changed, 93 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 9619e3e..452e8ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -150,6 +150,22 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "assert_cmd" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1835b7f27878de8525dc71410b5a31cdcc5f230aed5ba5df968e09c201b23d" +dependencies = [ + "anstyle", + "bstr", + "doc-comment", + "libc", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + [[package]] name = "async-trait" version = "0.1.82" @@ -272,6 +288,17 @@ dependencies = [ "cipher", ] +[[package]] +name = "bstr" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -697,6 +724,12 @@ version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + [[package]] name = "digest" version = "0.10.7" @@ -720,6 +753,12 @@ dependencies = [ "syn", ] +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + [[package]] name = "ecdsa" version = "0.16.9" @@ -842,6 +881,7 @@ version = "0.0.0" name = "example-cli" version = "0.1.0" dependencies = [ + "assert_cmd", "cidr", "env_logger", "harmony", @@ -2482,6 +2522,33 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "predicates" +version = "3.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573" +dependencies = [ + "anstyle", + "difflib", + "predicates-core", +] + +[[package]] +name = "predicates-core" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa" + +[[package]] +name = "predicates-tree" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "pretty_assertions" version = "1.4.1" @@ -3426,6 +3493,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "termtree" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" + [[package]] name = "thiserror" version = "1.0.63" @@ -3826,6 +3899,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "want" version = "0.3.1" diff --git a/examples/cli/Cargo.toml b/examples/cli/Cargo.toml index 0b46a64..7e8495c 100644 --- a/examples/cli/Cargo.toml +++ b/examples/cli/Cargo.toml @@ -16,3 +16,4 @@ harmony_macros = { path = "../../harmony_macros" } log = { workspace = true } env_logger = { workspace = true } url = { workspace = true } +assert_cmd = "2.0.16" diff --git a/examples/cli/src/main.rs b/examples/cli/src/main.rs index b7b58f4..1fe1df5 100644 --- a/examples/cli/src/main.rs +++ b/examples/cli/src/main.rs @@ -18,3 +18,13 @@ async fn main() { ]); harmony_cli::init(maestro).await.unwrap(); } + +use assert_cmd::Command; + +#[test] +fn test_example() { + let mut cmd = Command::cargo_bin("example-cli").unwrap(); + let assert = cmd.arg("--run").arg("SuccessScore").assert(); + + assert.success(); +} -- 2.39.5 From 9a1eac7c8aa0b9adf2d61b78a78f2582407d01ec Mon Sep 17 00:00:00 2001 From: tahahawa Date: Fri, 11 Apr 2025 17:03:17 -0400 Subject: [PATCH 07/23] update README --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 6fed6eb..d5adee6 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,24 @@ This will launch Harmony's minimalist terminal ui which embeds a few demo scores Usage instructions will be displayed at the bottom of the TUI. +`cargo run --bin example-cli -- --help` + +This is the harmony CLI, a minimal implementation + +The current help text: + +``` +Usage: example-cli [OPTIONS] --run + +Options: + -r, --run Name of score to run + -i, --interactive Run interactive or not + -a, --all Run all or nth + -n, --number Run nth matching, zero indexed [default: 0] + -h, --help Print help + -V, --version Print version +``` + ## Core architecture ![Harmony Core Architecture](docs/diagrams/Harmony_Core_Architecture.drawio.svg) -- 2.39.5 From 508ca3352d6166f946201c382f96bcd4451ca1a9 Mon Sep 17 00:00:00 2001 From: tahahawa Date: Fri, 11 Apr 2025 17:13:19 -0400 Subject: [PATCH 08/23] optimize to map and filter in the same step --- harmony_cli/src/lib.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index 41894ab..e9c82b6 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -53,10 +53,9 @@ pub async fn init( let scores = maestro.scores(); let scores_read = scores.read().expect("Should be able to read scores"); - let scores_read_vec: Vec>> = - scores_read.iter().map(|s| s.clone_box()).collect(); - let filtered: Vec<&Box>> = scores_read_vec + let filtered: Vec>> = scores_read .iter() + .map(|s| s.clone_box()) .filter(|s| s.name().contains(&args.run)) .collect(); -- 2.39.5 From 0a5d3b531a409ac901dd3ade328d12b4b5820ba9 Mon Sep 17 00:00:00 2001 From: tahahawa Date: Mon, 14 Apr 2025 11:03:47 -0400 Subject: [PATCH 09/23] Updates to address comments --- README.md | 3 ++- harmony_cli/Cargo.toml | 1 + harmony_cli/src/lib.rs | 42 +++++++++++++++++++++++++++++++----------- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index d5adee6..20eea14 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,14 @@ This is the harmony CLI, a minimal implementation The current help text: ``` -Usage: example-cli [OPTIONS] --run +Usage: example-cli [OPTIONS] Options: -r, --run Name of score to run -i, --interactive Run interactive or not -a, --all Run all or nth -n, --number Run nth matching, zero indexed [default: 0] + -l, --list list scores, will also be affected by run filter -h, --help Print help -V, --version Print version ``` diff --git a/harmony_cli/Cargo.toml b/harmony_cli/Cargo.toml index ee8ccc2..525dc86 100644 --- a/harmony_cli/Cargo.toml +++ b/harmony_cli/Cargo.toml @@ -12,4 +12,5 @@ harmony_tui = { path = "../harmony_tui", optional = true } [features] +default = ["tui"] tui = ["dep:harmony_tui"] diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index e9c82b6..c6bdcbc 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -1,5 +1,5 @@ -use clap::Parser; use clap::builder::ArgPredicate; +use clap::{Arg, CommandFactory, Parser}; use harmony; use harmony::{score::Score, topology::Topology}; @@ -14,9 +14,9 @@ struct Args { #[arg( short, long, - default_value_if("interactive", ArgPredicate::IsPresent, Some("unused")) + default_value_if("interactive", ArgPredicate::IsPresent, Some("")) )] - run: String, + run: Option, /// Name of score to run #[cfg(not(feature = "tui"))] @@ -34,6 +34,10 @@ struct Args { /// Run nth matching, zero indexed #[arg(short, long, default_value_t = 0)] number: u8, + + /// list scores, will also be affected by run filter + #[arg(short, long, default_value_t = false)] + list: bool, } pub async fn init( @@ -51,24 +55,40 @@ pub async fn init( return Err("Not compiled with interactive support".into()); } + // if no score to run provided, and list isn't specified, print help + if args.run.is_none() && !args.list { + Args::command().print_help(); + return Ok(()); + } + let scores = maestro.scores(); let scores_read = scores.read().expect("Should be able to read scores"); - let filtered: Vec>> = scores_read - .iter() - .map(|s| s.clone_box()) - .filter(|s| s.name().contains(&args.run)) - .collect(); + let scores_vec: Vec>> = match args.run.clone() { + Some(filter) => scores_read + .iter() + .map(|s| s.clone_box()) + .filter(|s| s.name().contains(&filter)) + .collect(), + None => scores_read.iter().map(|s| s.clone_box()).collect(), + }; - if filtered.len() == 0 { + // if list option is specified, print filtered list and exit + if args.list { + println!("Available scores: {:#?}", scores_vec); + return Ok(()); + } + + if scores_vec.len() == 0 { return Err("No score containing query found".into()); } + // if all is specified, run all. Otherwise, run the first match or specified index if args.all { - for s in filtered { + for s in scores_vec { println!("Running: {}", s.clone_box().name()); } } else { - let score = filtered.get(args.number as usize); + let score = scores_vec.get(args.number as usize); match score { Some(s) => println!("Running: {}", s.clone_box().name()), None => return Err("Invalid index given".into()), -- 2.39.5 From e845544035a4e53eb2f17cae3f465fa888ad419d Mon Sep 17 00:00:00 2001 From: tahahawa Date: Mon, 14 Apr 2025 15:50:14 -0400 Subject: [PATCH 10/23] Separate filtering from running, and actually invoke interpret to run the scores --- README.md | 12 ++++++----- harmony_cli/src/lib.rs | 49 +++++++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 20eea14..4f53d25 100644 --- a/README.md +++ b/README.md @@ -14,13 +14,14 @@ This is the harmony CLI, a minimal implementation The current help text: -``` -Usage: example-cli [OPTIONS] +```` +Usage: harmony_cli [OPTIONS] Options: - -r, --run Name of score to run - -i, --interactive Run interactive or not - -a, --all Run all or nth + -r, --run Run score(s) or not + -f, --filter Filter query + -i, --interactive Run interactive TUI or not + -a, --all Run all or nth, defaults to all -n, --number Run nth matching, zero indexed [default: 0] -l, --list list scores, will also be affected by run filter -h, --help Print help @@ -30,3 +31,4 @@ Options: ## Core architecture ![Harmony Core Architecture](docs/diagrams/Harmony_Core_Architecture.drawio.svg) +```` diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index c6bdcbc..4d4538f 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -1,3 +1,5 @@ +use std::error::Error; + use clap::builder::ArgPredicate; use clap::{Arg, CommandFactory, Parser}; use harmony; @@ -9,26 +11,20 @@ use harmony_tui; #[derive(Parser, Debug)] #[command(version, about, long_about = None)] struct Args { - /// Name of score to run - #[cfg(feature = "tui")] - #[arg( - short, - long, - default_value_if("interactive", ArgPredicate::IsPresent, Some("")) - )] - run: Option, + /// Run score(s) or not + #[arg(short, long, default_value_t = false)] + run: bool, - /// Name of score to run - #[cfg(not(feature = "tui"))] + /// Filter query #[arg(short, long)] - run: String, + filter: Option, - /// Run interactive or not + /// Run interactive TUI or not #[arg(short, long, default_value_t = false)] interactive: bool, - /// Run all or nth - #[arg(short, long, default_value_t = false)] + /// Run all or nth, defaults to all + #[arg(short, long, default_value_t = true)] all: bool, /// Run nth matching, zero indexed @@ -56,41 +52,46 @@ pub async fn init( } // if no score to run provided, and list isn't specified, print help - if args.run.is_none() && !args.list { + if !args.run && !args.list { + println!("Please include at least --run or --list"); Args::command().print_help(); return Ok(()); } let scores = maestro.scores(); let scores_read = scores.read().expect("Should be able to read scores"); - let scores_vec: Vec>> = match args.run.clone() { - Some(filter) => scores_read + let scores_vec: Vec>> = match args.filter.clone() { + Some(f) => scores_read .iter() .map(|s| s.clone_box()) - .filter(|s| s.name().contains(&filter)) + .filter(|s| s.name().contains(&f)) .collect(), None => scores_read.iter().map(|s| s.clone_box()).collect(), }; + if scores_vec.len() == 0 { + return Err("No score found".into()); + } + // if list option is specified, print filtered list and exit if args.list { println!("Available scores: {:#?}", scores_vec); return Ok(()); } - if scores_vec.len() == 0 { - return Err("No score containing query found".into()); - } - // if all is specified, run all. Otherwise, run the first match or specified index if args.all { for s in scores_vec { - println!("Running: {}", s.clone_box().name()); + println!("Running: {}", s.name()); + maestro.interpret(s).await?; } } else { let score = scores_vec.get(args.number as usize); match score { - Some(s) => println!("Running: {}", s.clone_box().name()), + Some(s) => { + println!("Running: {}", s.name()); + maestro.interpret(s.clone_box()).await?; + } None => return Err("Invalid index given".into()), } } -- 2.39.5 From ee9270d7714c97b7c2e2036f9b19a5f6c18e314b Mon Sep 17 00:00:00 2001 From: tahahawa Date: Mon, 14 Apr 2025 17:13:57 -0400 Subject: [PATCH 11/23] Add failure test --- examples/cli/src/main.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/examples/cli/src/main.rs b/examples/cli/src/main.rs index 1fe1df5..494a1f6 100644 --- a/examples/cli/src/main.rs +++ b/examples/cli/src/main.rs @@ -22,9 +22,17 @@ async fn main() { use assert_cmd::Command; #[test] -fn test_example() { +fn test_example_success() { let mut cmd = Command::cargo_bin("example-cli").unwrap(); - let assert = cmd.arg("--run").arg("SuccessScore").assert(); + let assert = cmd.args(&["--run", "--filter", "SuccessScore"]).assert(); assert.success(); } + +#[test] +fn test_example_fail() { + let mut cmd_fail = Command::cargo_bin("example-cli").unwrap(); + let assert_fail = cmd_fail.args(&["--run", "--filter", "ErrorScore"]).assert(); + + assert_fail.failure(); +} -- 2.39.5 From b781a7ff4a93cc21a1161754995c5f454dc69955 Mon Sep 17 00:00:00 2001 From: tahahawa Date: Thu, 17 Apr 2025 15:21:49 -0400 Subject: [PATCH 12/23] Add prompt on run if --yes not specified, add tests, separate out function for filtering, bug fixes, etc --- Cargo.lock | 1021 ++++++++++++++++---------- examples/cli/src/main.rs | 6 +- harmony/src/modules/dummy.rs | 2 +- harmony/src/modules/helm/resource.rs | 8 + harmony_cli/Cargo.toml | 3 + harmony_cli/src/lib.rs | 334 ++++++++- 6 files changed, 950 insertions(+), 424 deletions(-) create mode 100644 harmony/src/modules/helm/resource.rs diff --git a/Cargo.lock b/Cargo.lock index 452e8ef..9564fdb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -68,7 +68,7 @@ dependencies = [ "const-random", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -103,9 +103,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -118,43 +118,44 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "once_cell", + "windows-sys 0.59.0", ] [[package]] name = "assert_cmd" -version = "2.0.16" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1835b7f27878de8525dc71410b5a31cdcc5f230aed5ba5df968e09c201b23d" +checksum = "2bd389a4b2970a01282ee455294913c0a43724daedcd1a24c3eb0ec1c1320b66" dependencies = [ "anstyle", "bstr", @@ -168,9 +169,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", @@ -179,9 +180,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" @@ -218,9 +219,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" -version = "1.6.0" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" [[package]] name = "bcrypt-pbkdf" @@ -241,9 +242,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" dependencies = [ "serde", ] @@ -301,9 +302,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "byteorder" @@ -313,9 +314,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cassowary" @@ -343,9 +344,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.16" +version = "1.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" dependencies = [ "shlex", ] @@ -369,9 +370,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "android-tzdata", "iana-time-zone", @@ -379,7 +380,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -400,9 +401,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.35" +version = "4.5.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" +checksum = "2df961d8c8a0d08aa9945718ccf584145eee3f3aa06cddbeac12933781102e04" dependencies = [ "clap_builder", "clap_derive", @@ -410,9 +411,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.35" +version = "4.5.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" +checksum = "132dbda40fb6753878316a489d5a1242a8ef2f0d9e47ba01c951ea8aa7d013a5" dependencies = [ "anstream", "anstyle", @@ -467,9 +468,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "compact_str" @@ -506,7 +507,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "getrandom", + "getrandom 0.2.15", "once_cell", "tiny-keccak", ] @@ -539,9 +540,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -555,18 +556,34 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossterm" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67" +dependencies = [ + "bitflags 1.3.2", + "crossterm_winapi", + "libc", + "mio 0.8.11", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + [[package]] name = "crossterm" version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "crossterm_winapi", "futures-core", - "mio", + "mio 1.0.3", "parking_lot", - "rustix", + "rustix 0.38.44", "signal-hook", "signal-hook-mio", "winapi", @@ -583,9 +600,9 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -594,7 +611,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -606,7 +623,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "typenum", ] @@ -648,9 +665,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -658,9 +675,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", @@ -672,9 +689,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", @@ -683,9 +700,9 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "der" @@ -759,6 +776,12 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" +[[package]] +name = "dyn-clone" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" + [[package]] name = "ecdsa" version = "0.16.9" @@ -791,7 +814,7 @@ checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", - "rand_core", + "rand_core 0.6.4", "serde", "sha2", "subtle", @@ -800,9 +823,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elliptic-curve" @@ -819,7 +842,7 @@ dependencies = [ "hkdf", "pem-rfc7468", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -827,18 +850,18 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] [[package]] name = "env_filter" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", "regex", @@ -846,31 +869,31 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.5" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" dependencies = [ "anstream", "anstyle", "env_filter", - "humantime", + "jiff", "log", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -901,7 +924,7 @@ dependencies = [ "env_logger", "harmony", "harmony_macros", - "http 1.2.0", + "http 1.3.1", "k8s-openapi", "kube", "log", @@ -981,17 +1004,17 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "ff" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1003,12 +1026,12 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "flate2" -version = "1.0.33" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", + "miniz_oxide 0.8.8", ] [[package]] @@ -1031,9 +1054,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foreign-types" @@ -1067,9 +1090,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1082,9 +1105,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1092,15 +1115,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1109,15 +1132,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -1126,21 +1149,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1154,6 +1177,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 = "fxhash" version = "0.2.1" @@ -1182,7 +1214,19 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -1208,7 +1252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1241,7 +1285,7 @@ dependencies = [ "env_logger", "harmony_macros", "harmony_types", - "http 1.2.0", + "http 1.3.1", "k8s-openapi", "kube", "libredfish", @@ -1265,9 +1309,12 @@ dependencies = [ name = "harmony_cli" version = "0.1.0" dependencies = [ + "assert_cmd", "clap", "harmony", "harmony_tui", + "inquire", + "tokio", ] [[package]] @@ -1286,7 +1333,7 @@ name = "harmony_tui" version = "0.1.0" dependencies = [ "color-eyre", - "crossterm", + "crossterm 0.28.1", "env_logger", "harmony", "log", @@ -1304,12 +1351,6 @@ dependencies = [ "serde", ] -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - [[package]] name = "hashbrown" version = "0.15.2" @@ -1330,7 +1371,7 @@ dependencies = [ "base64 0.21.7", "bytes", "headers-core", - "http 1.2.0", + "http 1.3.1", "httpdate", "mime", "sha1", @@ -1342,7 +1383,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 1.2.0", + "http 1.3.1", ] [[package]] @@ -1383,11 +1424,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1403,9 +1444,9 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -1430,27 +1471,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http 1.3.1", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", - "http 1.2.0", + "futures-core", + "http 1.3.1", "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.9.4" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1458,17 +1499,11 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "hyper" -version = "0.14.30" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -1490,14 +1525,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "httparse", "itoa", @@ -1509,15 +1544,15 @@ dependencies = [ [[package]] name = "hyper-http-proxy" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d06dbdfbacf34d996c6fb540a71a684a7aae9056c71951163af8a8a4c07b9a4" +checksum = "7ad4b0a1e37510028bc4ba81d0e38d239c39671b0f0ce9e02dfa93a8133f7c08" dependencies = [ "bytes", "futures-util", "headers", - "http 1.2.0", - "hyper 1.5.2", + "http 1.3.1", + "hyper 1.6.0", "hyper-rustls", "hyper-util", "pin-project-lite", @@ -1534,8 +1569,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.2.0", - "hyper 1.5.2", + "http 1.3.1", + "hyper 1.6.0", "hyper-util", "log", "rustls", @@ -1552,7 +1587,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.5.2", + "hyper 1.6.0", "hyper-util", "pin-project-lite", "tokio", @@ -1566,7 +1601,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.30", + "hyper 0.14.32", "native-tls", "tokio", "tokio-native-tls", @@ -1574,16 +1609,17 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", - "hyper 1.5.2", + "hyper 1.6.0", + "libc", "pin-project-lite", "socket2", "tokio", @@ -1593,14 +1629,15 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -1655,9 +1692,9 @@ dependencies = [ [[package]] name = "icu_locid_transform_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] name = "icu_normalizer" @@ -1679,9 +1716,9 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" [[package]] name = "icu_properties" @@ -1700,9 +1737,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" [[package]] name = "icu_provider" @@ -1767,30 +1804,47 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indexmap" -version = "2.5.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown", ] [[package]] name = "indoc" -version = "2.0.5" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" [[package]] name = "inout" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" dependencies = [ "block-padding", "generic-array", ] +[[package]] +name = "inquire" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fddf93031af70e75410a2511ec04d49e758ed2f26dad3404a934e0fb45cc12a" +dependencies = [ + "bitflags 2.9.0", + "crossterm 0.25.0", + "dyn-clone", + "fuzzy-matcher", + "fxhash", + "newline-converter", + "once_cell", + "unicode-segmentation", + "unicode-width 0.1.14", +] + [[package]] name = "instability" version = "0.3.7" @@ -1806,9 +1860,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is_terminal_polyfill" @@ -1827,16 +1881,41 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ad87c89110f55e4cd4dc2893a9790820206729eaf221555f742d540b0724a0" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", +] + +[[package]] +name = "jiff-static" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d076d5b64a7e2fe6f0743f02c43ca4a6725c0f904203bfe276a5b3e793103605" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1850,7 +1929,7 @@ dependencies = [ "pest_derive", "regex", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -1889,10 +1968,10 @@ dependencies = [ "either", "futures", "home", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "http-body-util", - "hyper 1.5.2", + "hyper 1.6.0", "hyper-http-proxy", "hyper-rustls", "hyper-timeout", @@ -1907,7 +1986,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tokio-util", "tower", @@ -1923,12 +2002,12 @@ checksum = "97aa830b288a178a90e784d1b0f1539f2d200d2188c7b4a3146d9dc983d596f3" dependencies = [ "chrono", "form_urlencoded", - "http 1.2.0", + "http 1.3.1", "k8s-openapi", "serde", "serde-value", "serde_json", - "thiserror 2.0.11", + "thiserror 2.0.12", ] [[package]] @@ -1942,15 +2021,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.158" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libredfish" @@ -1967,15 +2046,21 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "lock_api" @@ -1989,9 +2074,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "log-panics" @@ -2008,7 +2093,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown", ] [[package]] @@ -2040,31 +2125,42 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.2" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ - "hermit-abi", "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -2077,6 +2173,15 @@ dependencies = [ "tempfile", ] +[[package]] +name = "newline-converter" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b6b097ecb1cbfed438542d16e84fd7ad9b0c76c8a65b7f9039212a3d14dc7f" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -2085,7 +2190,7 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", - "rand", + "rand 0.8.5", ] [[package]] @@ -2100,7 +2205,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.5", "smallvec", "zeroize", ] @@ -2156,9 +2261,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "opaque-debug" @@ -2168,11 +2273,11 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "cfg-if", "foreign-types", "libc", @@ -2194,15 +2299,15 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" dependencies = [ "cc", "libc", @@ -2225,7 +2330,7 @@ dependencies = [ "russh-sftp", "serde", "serde_json", - "thiserror 1.0.63", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-util", @@ -2239,9 +2344,9 @@ dependencies = [ "env_logger", "log", "pretty_assertions", - "rand", + "rand 0.8.5", "serde", - "thiserror 1.0.63", + "thiserror 1.0.69", "tokio", "uuid", "xml-rs", @@ -2278,9 +2383,9 @@ dependencies = [ [[package]] name = "p384" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70786f51bcc69f6a4c0360e063a4cac5419ef7c5cd5b3c99ad70f3be5ba79209" +checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" dependencies = [ "ecdsa", "elliptic-curve", @@ -2298,7 +2403,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "rand_core", + "rand_core 0.6.4", "sha2", ] @@ -2332,7 +2437,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" dependencies = [ "base64ct", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -2366,9 +2471,9 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" +checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" dependencies = [ "base64 0.22.1", "serde", @@ -2391,20 +2496,20 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" dependencies = [ "memchr", - "thiserror 2.0.11", + "thiserror 2.0.12", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816518421cfc6887a0d62bf441b6ffb4536fcc926395a69e1a85852d4363f57e" +checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" dependencies = [ "pest", "pest_generator", @@ -2412,9 +2517,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d1396fd3a870fc7838768d171b4616d5c91f6cc25e377b673d714567d99377b" +checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" dependencies = [ "pest", "pest_meta", @@ -2425,9 +2530,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.7.15" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e58089ea25d717bfd31fb534e4f3afcc2cc569c70de3e239778991ea3b7dea" +checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" dependencies = [ "once_cell", "pest", @@ -2436,9 +2541,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -2480,15 +2585,15 @@ checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ "der", "pkcs5", - "rand_core", + "rand_core 0.6.4", "spki", ] [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "poly1305" @@ -2514,12 +2619,27 @@ dependencies = [ ] [[package]] -name = "ppv-lite86" -version = "0.2.20" +name = "portable-atomic" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" dependencies = [ - "zerocopy", + "portable-atomic", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.24", ] [[package]] @@ -2570,22 +2690,28 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "radium" version = "0.7.0" @@ -2599,8 +2725,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", ] [[package]] @@ -2610,7 +2746,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -2619,7 +2765,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", ] [[package]] @@ -2628,10 +2783,10 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "cassowary", "compact_str", - "crossterm", + "crossterm 0.28.1", "indoc", "instability", "itertools", @@ -2645,18 +2800,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -2666,9 +2821,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -2677,9 +2832,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" @@ -2695,7 +2850,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper 0.14.32", "hyper-tls", "ipnet", "js-sys", @@ -2733,24 +2888,23 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] [[package]] name = "rsa" -version = "0.9.6" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" dependencies = [ "const-oid", "digest", @@ -2759,7 +2913,7 @@ dependencies = [ "num-traits", "pkcs1", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sha2", "signature", "spki", @@ -2776,7 +2930,7 @@ dependencies = [ "aes", "aes-gcm", "async-trait", - "bitflags 2.6.0", + "bitflags 2.9.0", "byteorder", "cbc", "chacha20", @@ -2797,8 +2951,8 @@ dependencies = [ "p384", "p521", "poly1305", - "rand", - "rand_core", + "rand 0.8.5", + "rand_core 0.6.4", "russh-cryptovec", "russh-keys", "sha1", @@ -2806,7 +2960,7 @@ dependencies = [ "ssh-encoding", "ssh-key", "subtle", - "thiserror 1.0.63", + "thiserror 1.0.69", "tokio", ] @@ -2853,8 +3007,8 @@ dependencies = [ "pkcs1", "pkcs5", "pkcs8", - "rand", - "rand_core", + "rand 0.8.5", + "rand_core 0.6.4", "rsa", "russh-cryptovec", "sec1", @@ -2864,7 +3018,7 @@ dependencies = [ "spki", "ssh-encoding", "ssh-key", - "thiserror 1.0.63", + "thiserror 1.0.69", "tokio", "tokio-stream", "typenum", @@ -2873,18 +3027,17 @@ dependencies = [ [[package]] name = "russh-sftp" -version = "2.0.6" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a72c8afe2041c17435eecd85d0b7291841486fd3d1c4082e0b212e5437ca42" +checksum = "f08ed364d54b74d988c964b464a53a1916379f9441cfd10ca8fb264be1349842" dependencies = [ - "async-trait", - "bitflags 2.6.0", + "bitflags 2.9.0", "bytes", "chrono", "flurry", "log", "serde", - "thiserror 1.0.63", + "thiserror 2.0.12", "tokio", "tokio-util", ] @@ -2899,9 +3052,9 @@ dependencies = [ "bitvec", "cbc", "hmac", - "rand", + "rand 0.8.5", "sha2", - "thiserror 1.0.63", + "thiserror 1.0.69", ] [[package]] @@ -2921,22 +3074,35 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.36" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f55e80d50763938498dd5ebb18647174e0c76dc38c5505294bb224624f30f36" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys", - "windows-sys 0.52.0", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.9.4", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.21" +version = "0.23.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" +checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" dependencies = [ "log", "once_cell", @@ -2992,15 +3158,15 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" dependencies = [ "ring", "rustls-pki-types", @@ -3009,15 +3175,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "salsa20" @@ -3030,11 +3196,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3083,7 +3249,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -3096,7 +3262,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.0", "core-foundation 0.10.0", "core-foundation-sys", "libc", @@ -3121,15 +3287,15 @@ checksum = "689224d06523904ebcc9b482c6a3f4f7fb396096645c4cd10c0d2ff7371a34d3" [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" -version = "1.0.217" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] @@ -3146,9 +3312,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.217" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -3157,9 +3323,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -3258,7 +3424,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" dependencies = [ "libc", - "mio", + "mio 0.8.11", + "mio 1.0.3", "signal-hook", ] @@ -3278,7 +3445,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -3292,15 +3459,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -3352,9 +3519,9 @@ dependencies = [ [[package]] name = "ssh-key" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca9b366a80cf18bb6406f4cf4d10aebfb46140a8c0c33f666a144c5c76ecbafc" +checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" dependencies = [ "bcrypt-pbkdf", "ed25519-dalek", @@ -3362,7 +3529,7 @@ dependencies = [ "p256", "p384", "p521", - "rand_core", + "rand_core 0.6.4", "rsa", "sec1", "sha2", @@ -3421,9 +3588,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.90" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -3482,14 +3649,14 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.12.0" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if", "fastrand", + "getrandom 0.3.2", "once_cell", - "rustix", + "rustix 1.0.5", "windows-sys 0.59.0", ] @@ -3501,27 +3668,27 @@ checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl 1.0.63", + "thiserror-impl 1.0.69", ] [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.12", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", @@ -3530,9 +3697,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", @@ -3570,14 +3737,14 @@ dependencies = [ [[package]] name = "tokio" -version = "1.40.0" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", "libc", - "mio", + "mio 1.0.3", "pin-project-lite", "signal-hook-registry", "socket2", @@ -3587,9 +3754,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", @@ -3608,9 +3775,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", "tokio", @@ -3629,9 +3796,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" dependencies = [ "bytes", "futures-core", @@ -3664,9 +3831,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" dependencies = [ "base64 0.22.1", - "bitflags 2.6.0", + "bitflags 2.9.0", "bytes", - "http 1.2.0", + "http 1.3.1", "http-body 1.0.1", "mime", "pin-project-lite", @@ -3689,9 +3856,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -3712,9 +3879,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -3749,9 +3916,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tui-logger" -version = "0.14.1" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a5249b5e5df37af5389721794f9839dad0b3f7b92445f24528199acf2f1805" +checksum = "2f3fb54e48fa37d5081603f7804c730734b381235ebd876cb1e66f853a7d2533" dependencies = [ "chrono", "fxhash", @@ -3759,13 +3926,14 @@ dependencies = [ "log", "parking_lot", "ratatui", + "unicode-segmentation", ] [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "ucd-trie" @@ -3775,9 +3943,9 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-segmentation" @@ -3861,20 +4029,20 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" dependencies = [ - "getrandom", - "rand", + "getrandom 0.3.2", + "rand 0.9.1", "uuid-macro-internal", ] [[package]] name = "uuid-macro-internal" -version = "1.11.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b91f57fe13a38d0ce9e28a03463d8d3c2468ed03d75375110ec71d93b449a08" +checksum = "72dcd78c4f979627a754f5522cea6e6a25e55139056535fe6e69c506cd64a862" dependencies = [ "proc-macro2", "quote", @@ -3924,25 +4092,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "wasm-bindgen" -version = "0.2.93" +name = "wasi" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", "syn", @@ -3951,21 +4128,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3973,9 +4151,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", @@ -3986,15 +4164,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -4024,11 +4205,61 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" dependencies = [ - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", ] [[package]] @@ -4189,6 +4420,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + [[package]] name = "write16" version = "1.0.0" @@ -4212,9 +4452,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.22" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" +checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" [[package]] name = "yansi" @@ -4276,8 +4516,16 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", ] [[package]] @@ -4292,19 +4540,30 @@ dependencies = [ ] [[package]] -name = "zerofrom" -version = "0.1.5" +name = "zerocopy-derive" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", diff --git a/examples/cli/src/main.rs b/examples/cli/src/main.rs index 494a1f6..8689b02 100644 --- a/examples/cli/src/main.rs +++ b/examples/cli/src/main.rs @@ -16,7 +16,7 @@ async fn main() { Box::new(ErrorScore {}), Box::new(PanicScore {}), ]); - harmony_cli::init(maestro).await.unwrap(); + harmony_cli::init(maestro, None).await.unwrap(); } use assert_cmd::Command; @@ -24,7 +24,7 @@ use assert_cmd::Command; #[test] fn test_example_success() { let mut cmd = Command::cargo_bin("example-cli").unwrap(); - let assert = cmd.args(&["--run", "--filter", "SuccessScore"]).assert(); + let assert = cmd.args(&["--yes", "--filter", "SuccessScore"]).assert(); assert.success(); } @@ -32,7 +32,7 @@ fn test_example_success() { #[test] fn test_example_fail() { let mut cmd_fail = Command::cargo_bin("example-cli").unwrap(); - let assert_fail = cmd_fail.args(&["--run", "--filter", "ErrorScore"]).assert(); + let assert_fail = cmd_fail.args(&["--yes", "--filter", "ErrorScore"]).assert(); assert_fail.failure(); } diff --git a/harmony/src/modules/dummy.rs b/harmony/src/modules/dummy.rs index 2e63797..e212872 100644 --- a/harmony/src/modules/dummy.rs +++ b/harmony/src/modules/dummy.rs @@ -47,7 +47,7 @@ impl Score for SuccessScore { /// An interpret that only returns the result it is given when built. It does nothing else. Only /// useful for development/testing purposes. -#[derive(Debug)] +#[derive(Debug, Clone)] struct DummyInterpret { status: InterpretStatus, result: Result, diff --git a/harmony/src/modules/helm/resource.rs b/harmony/src/modules/helm/resource.rs new file mode 100644 index 0000000..66fe4d5 --- /dev/null +++ b/harmony/src/modules/helm/resource.rs @@ -0,0 +1,8 @@ +use serde_yaml; +use std::collections::HashMap; + +#[derive(Debug, Clone, Serialize)] +pub struct HelmResourceScore { + // pub values: serde_yaml, + pub include_CRDs: bool, +} diff --git a/harmony_cli/Cargo.toml b/harmony_cli/Cargo.toml index 525dc86..ad681bd 100644 --- a/harmony_cli/Cargo.toml +++ b/harmony_cli/Cargo.toml @@ -6,9 +6,12 @@ readme.workspace = true license.workspace = true [dependencies] +assert_cmd = "2.0.17" clap = { version = "4.5.35", features = ["derive"] } harmony = { path = "../harmony" } harmony_tui = { path = "../harmony_tui", optional = true } +inquire = "0.7.5" +tokio.workspace = true [features] diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index 4d4538f..0d73b21 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -1,19 +1,18 @@ -use std::error::Error; - +use clap::Parser; use clap::builder::ArgPredicate; -use clap::{Arg, CommandFactory, Parser}; use harmony; use harmony::{score::Score, topology::Topology}; +use inquire::Confirm; #[cfg(feature = "tui")] use harmony_tui; #[derive(Parser, Debug)] #[command(version, about, long_about = None)] -struct Args { +pub struct Args { /// Run score(s) or not #[arg(short, long, default_value_t = false)] - run: bool, + yes: bool, /// Filter query #[arg(short, long)] @@ -24,22 +23,59 @@ struct Args { interactive: bool, /// Run all or nth, defaults to all - #[arg(short, long, default_value_t = true)] + #[arg( + short, + long, + default_value_t = true, + default_value_if("number", ArgPredicate::IsPresent, "false") + )] all: bool, /// Run nth matching, zero indexed #[arg(short, long, default_value_t = 0)] - number: u8, + number: usize, /// list scores, will also be affected by run filter #[arg(short, long, default_value_t = false)] list: bool, } +fn maestro_scores_filter( + maestro: &harmony::maestro::Maestro, + all: bool, + filter: Option, + number: usize, +) -> Vec>> { + let scores = maestro.scores(); + let scores_read = scores.read().expect("Should be able to read scores"); + let mut scores_vec: Vec>> = match filter { + Some(f) => scores_read + .iter() + .map(|s| s.clone_box()) + .filter(|s| s.name().contains(&f)) + .collect(), + None => scores_read.iter().map(|s| s.clone_box()).collect(), + }; + + if !all { + let score = scores_vec.get(number); + match score { + Some(s) => scores_vec = vec![s.clone_box()], + None => return vec![], + } + }; + + return scores_vec; +} + pub async fn init( maestro: harmony::maestro::Maestro, + args_struct: Option, ) -> Result<(), Box> { - let args = Args::parse(); + let args = match args_struct { + Some(args) => args, + None => Args::parse(), + }; #[cfg(feature = "tui")] if args.interactive { @@ -51,28 +87,25 @@ pub async fn init( return Err("Not compiled with interactive support".into()); } - // if no score to run provided, and list isn't specified, print help - if !args.run && !args.list { - println!("Please include at least --run or --list"); - Args::command().print_help(); - return Ok(()); - } - - let scores = maestro.scores(); - let scores_read = scores.read().expect("Should be able to read scores"); - let scores_vec: Vec>> = match args.filter.clone() { - Some(f) => scores_read - .iter() - .map(|s| s.clone_box()) - .filter(|s| s.name().contains(&f)) - .collect(), - None => scores_read.iter().map(|s| s.clone_box()).collect(), - }; + let scores_vec = maestro_scores_filter(&maestro, args.all, args.filter, args.number); if scores_vec.len() == 0 { return Err("No score found".into()); } + // if no score to run provided, and list isn't specified, print help + if !args.yes { + let confirmation = + Confirm::new(format!("This will run the following scores: {:#?}", scores_vec).as_str()) + .with_default(true) + .prompt() + .expect("Unexpected prompt error"); + + if !confirmation { + return Ok(()); + } + } + // if list option is specified, print filtered list and exit if args.list { println!("Available scores: {:#?}", scores_vec); @@ -80,21 +113,244 @@ pub async fn init( } // if all is specified, run all. Otherwise, run the first match or specified index - if args.all { - for s in scores_vec { - println!("Running: {}", s.name()); - maestro.interpret(s).await?; - } - } else { - let score = scores_vec.get(args.number as usize); - match score { - Some(s) => { - println!("Running: {}", s.name()); - maestro.interpret(s.clone_box()).await?; - } - None => return Err("Invalid index given".into()), - } + for s in scores_vec { + println!("Running: {}", s.name()); + maestro.interpret(s).await?; } Ok(()) } + +#[cfg(test)] +mod test { + use harmony::{ + inventory::Inventory, + maestro::Maestro, + modules::dummy::{ErrorScore, PanicScore, SuccessScore}, + topology::HAClusterTopology, + }; + + #[tokio::test] + async fn test_init_success_score() { + let inventory = Inventory::autoload(); + let topology = HAClusterTopology::autoload(); + let mut maestro = Maestro::new(inventory, topology); + + maestro.register_all(vec![ + Box::new(SuccessScore {}), + Box::new(ErrorScore {}), + Box::new(PanicScore {}), + ]); + + let res = crate::init( + maestro, + Some(crate::Args { + yes: true, + filter: Some("SuccessScore".to_owned()), + interactive: false, + all: true, + number: 0, + list: false, + }), + ) + .await; + + assert!(res.is_ok()); + } + + #[tokio::test] + async fn test_init_error_score() { + let inventory = Inventory::autoload(); + let topology = HAClusterTopology::autoload(); + let mut maestro = Maestro::new(inventory, topology); + + maestro.register_all(vec![ + Box::new(SuccessScore {}), + Box::new(ErrorScore {}), + Box::new(PanicScore {}), + ]); + + let res = crate::init( + maestro, + Some(crate::Args { + yes: true, + filter: Some("ErrorScore".to_owned()), + interactive: false, + all: true, + number: 0, + list: false, + }), + ) + .await; + + assert!(res.is_err()); + } + + #[tokio::test] + async fn test_init_number_score() { + let inventory = Inventory::autoload(); + let topology = HAClusterTopology::autoload(); + let mut maestro = Maestro::new(inventory, topology); + + maestro.register_all(vec![ + Box::new(SuccessScore {}), + Box::new(ErrorScore {}), + Box::new(PanicScore {}), + ]); + + let res = crate::init( + maestro, + Some(crate::Args { + yes: true, + filter: None, + interactive: false, + all: false, + number: 0, + list: false, + }), + ) + .await; + + assert!(res.is_ok()); + } + + #[tokio::test] + async fn test_filter_fn_all() { + let inventory = Inventory::autoload(); + let topology = HAClusterTopology::autoload(); + let mut maestro = Maestro::new(inventory, topology); + + maestro.register_all(vec![ + Box::new(SuccessScore {}), + Box::new(ErrorScore {}), + Box::new(PanicScore {}), + ]); + + let res = crate::maestro_scores_filter(&maestro, true, None, 0); + + assert!(res.len() == 3); + } + + #[tokio::test] + async fn test_filter_fn_all_success() { + let inventory = Inventory::autoload(); + let topology = HAClusterTopology::autoload(); + let mut maestro = Maestro::new(inventory, topology); + + maestro.register_all(vec![ + Box::new(SuccessScore {}), + Box::new(ErrorScore {}), + Box::new(PanicScore {}), + ]); + + let res = crate::maestro_scores_filter(&maestro, true, Some("Success".to_owned()), 0); + + assert!(res.len() == 1); + + assert!( + maestro + .interpret(res.get(0).unwrap().clone_box()) + .await + .is_ok() + ); + } + + #[tokio::test] + async fn test_filter_fn_all_error() { + let inventory = Inventory::autoload(); + let topology = HAClusterTopology::autoload(); + let mut maestro = Maestro::new(inventory, topology); + + maestro.register_all(vec![ + Box::new(SuccessScore {}), + Box::new(ErrorScore {}), + Box::new(PanicScore {}), + ]); + + let res = crate::maestro_scores_filter(&maestro, true, Some("Error".to_owned()), 0); + + assert!(res.len() == 1); + + assert!( + maestro + .interpret(res.get(0).unwrap().clone_box()) + .await + .is_err() + ); + } + + #[tokio::test] + async fn test_filter_fn_all_score() { + let inventory = Inventory::autoload(); + let topology = HAClusterTopology::autoload(); + let mut maestro = Maestro::new(inventory, topology); + + maestro.register_all(vec![ + Box::new(SuccessScore {}), + Box::new(ErrorScore {}), + Box::new(PanicScore {}), + ]); + + let res = crate::maestro_scores_filter(&maestro, true, Some("Score".to_owned()), 0); + + assert!(res.len() == 3); + + assert!( + maestro + .interpret(res.get(0).unwrap().clone_box()) + .await + .is_ok() + ); + assert!( + maestro + .interpret(res.get(1).unwrap().clone_box()) + .await + .is_err() + ); + } + + #[tokio::test] + async fn test_filter_fn_number() { + let inventory = Inventory::autoload(); + let topology = HAClusterTopology::autoload(); + let mut maestro = Maestro::new(inventory, topology); + + maestro.register_all(vec![ + Box::new(SuccessScore {}), + Box::new(ErrorScore {}), + Box::new(PanicScore {}), + ]); + + let res = crate::maestro_scores_filter(&maestro, false, None, 0); + + println!("{:#?}", res); + + assert!(res.len() == 1); + + assert!( + maestro + .interpret(res.get(0).unwrap().clone_box()) + .await + .is_ok() + ); + } + + #[tokio::test] + async fn test_filter_fn_number_invalid() { + let inventory = Inventory::autoload(); + let topology = HAClusterTopology::autoload(); + let mut maestro = Maestro::new(inventory, topology); + + maestro.register_all(vec![ + Box::new(SuccessScore {}), + Box::new(ErrorScore {}), + Box::new(PanicScore {}), + ]); + + let res = crate::maestro_scores_filter(&maestro, false, None, 11); + + println!("{:#?}", res); + + assert!(res.len() == 0); + } +} -- 2.39.5 From f75d03c5709704681235480cc46c21d99066a43b Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Thu, 17 Apr 2025 18:04:08 -0400 Subject: [PATCH 13/23] Update readme, add conflict --- README.md | 7 +++---- harmony_cli/src/lib.rs | 3 ++- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4f53d25..bda7b1a 100644 --- a/README.md +++ b/README.md @@ -15,18 +15,17 @@ This is the harmony CLI, a minimal implementation The current help text: ```` -Usage: harmony_cli [OPTIONS] +Usage: example-cli [OPTIONS] Options: - -r, --run Run score(s) or not + -y, --yes Run score(s) or not -f, --filter Filter query -i, --interactive Run interactive TUI or not -a, --all Run all or nth, defaults to all -n, --number Run nth matching, zero indexed [default: 0] -l, --list list scores, will also be affected by run filter -h, --help Print help - -V, --version Print version -``` + -V, --version Print version``` ## Core architecture diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index 0d73b21..1dea3de 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -27,7 +27,8 @@ pub struct Args { short, long, default_value_t = true, - default_value_if("number", ArgPredicate::IsPresent, "false") + default_value_if("number", ArgPredicate::IsPresent, "false"), + conflicts_with = "number" )] all: bool, -- 2.39.5 From 92e60b00d2cbf9a33dca54d09bb2c46d109cbd17 Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Thu, 17 Apr 2025 18:22:39 -0400 Subject: [PATCH 14/23] add index to display --- harmony_cli/src/lib.rs | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index 1dea3de..d37f2bb 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -28,7 +28,8 @@ pub struct Args { long, default_value_t = true, default_value_if("number", ArgPredicate::IsPresent, "false"), - conflicts_with = "number" + conflicts_with = "number", + conflicts_with = "list" )] all: bool, @@ -69,6 +70,17 @@ fn maestro_scores_filter( return scores_vec; } +fn list_scores_with_index( + scores_vec: &Vec>>, +) -> String { + let mut display_str = String::new(); + for (i, s) in scores_vec.iter().enumerate() { + let name = s.name(); + display_str.push_str(&format!("\n{i}: {name}")); + } + return display_str; +} + pub async fn init( maestro: harmony::maestro::Maestro, args_struct: Option, @@ -94,25 +106,31 @@ pub async fn init( return Err("No score found".into()); } + // if list option is specified, print filtered list and exit + if args.list { + println!("Available scores:"); + println!("{}", list_scores_with_index(&scores_vec)); + return Ok(()); + } + // if no score to run provided, and list isn't specified, print help if !args.yes { - let confirmation = - Confirm::new(format!("This will run the following scores: {:#?}", scores_vec).as_str()) - .with_default(true) - .prompt() - .expect("Unexpected prompt error"); + let confirmation = Confirm::new( + format!( + "This will run the following scores: {}\n", + list_scores_with_index(&scores_vec) + ) + .as_str(), + ) + .with_default(true) + .prompt() + .expect("Unexpected prompt error"); if !confirmation { return Ok(()); } } - // if list option is specified, print filtered list and exit - if args.list { - println!("Available scores: {:#?}", scores_vec); - return Ok(()); - } - // if all is specified, run all. Otherwise, run the first match or specified index for s in scores_vec { println!("Running: {}", s.name()); -- 2.39.5 From ff568cd1b9b7befab9f6a4df653ecaf4f3d54143 Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Thu, 17 Apr 2025 18:25:41 -0400 Subject: [PATCH 15/23] Change help for --yes --- harmony_cli/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index d37f2bb..4d0f04c 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -10,7 +10,7 @@ use harmony_tui; #[derive(Parser, Debug)] #[command(version, about, long_about = None)] pub struct Args { - /// Run score(s) or not + /// Run score(s) without prompt #[arg(short, long, default_value_t = false)] yes: bool, -- 2.39.5 From b7fcc66fa5016b4d3b4fe46cbdb62b97a9b6e90f Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Thu, 17 Apr 2025 18:31:24 -0400 Subject: [PATCH 16/23] add conflicts for options with interactive --- harmony_cli/src/lib.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index 4d0f04c..e1e7dfb 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -11,11 +11,11 @@ use harmony_tui; #[command(version, about, long_about = None)] pub struct Args { /// Run score(s) without prompt - #[arg(short, long, default_value_t = false)] + #[arg(short, long, default_value_t = false, conflicts_with = "interactive")] yes: bool, /// Filter query - #[arg(short, long)] + #[arg(short, long, conflicts_with = "interactive")] filter: Option, /// Run interactive TUI or not @@ -29,16 +29,17 @@ pub struct Args { default_value_t = true, default_value_if("number", ArgPredicate::IsPresent, "false"), conflicts_with = "number", + conflicts_with = "interactive", conflicts_with = "list" )] all: bool, /// Run nth matching, zero indexed - #[arg(short, long, default_value_t = 0)] + #[arg(short, long, default_value_t = 0, conflicts_with = "interactive")] number: usize, /// list scores, will also be affected by run filter - #[arg(short, long, default_value_t = false)] + #[arg(short, long, default_value_t = false, conflicts_with = "interactive")] list: bool, } -- 2.39.5 From 9276ec05f004fe65c91329c0c7e0d8cd6ce0a2d8 Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Thu, 17 Apr 2025 18:32:25 -0400 Subject: [PATCH 17/23] remove conflict with all and list --- harmony_cli/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index e1e7dfb..675ed67 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -29,8 +29,7 @@ pub struct Args { default_value_t = true, default_value_if("number", ArgPredicate::IsPresent, "false"), conflicts_with = "number", - conflicts_with = "interactive", - conflicts_with = "list" + conflicts_with = "interactive" )] all: bool, -- 2.39.5 From d92c35987a6bc0f3ba9c3cb1500461d06139de60 Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Fri, 18 Apr 2025 09:59:00 -0400 Subject: [PATCH 18/23] rset harmony dir to master --- harmony/src/modules/dummy.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/harmony/src/modules/dummy.rs b/harmony/src/modules/dummy.rs index e212872..2e63797 100644 --- a/harmony/src/modules/dummy.rs +++ b/harmony/src/modules/dummy.rs @@ -47,7 +47,7 @@ impl Score for SuccessScore { /// An interpret that only returns the result it is given when built. It does nothing else. Only /// useful for development/testing purposes. -#[derive(Debug, Clone)] +#[derive(Debug)] struct DummyInterpret { status: InterpretStatus, result: Result, -- 2.39.5 From 8a1e20bda59fad3ebe86c4d39011043ff67bc454 Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Fri, 18 Apr 2025 10:01:34 -0400 Subject: [PATCH 19/23] remove unrelated --- harmony/src/modules/helm/resource.rs | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 harmony/src/modules/helm/resource.rs diff --git a/harmony/src/modules/helm/resource.rs b/harmony/src/modules/helm/resource.rs deleted file mode 100644 index 66fe4d5..0000000 --- a/harmony/src/modules/helm/resource.rs +++ /dev/null @@ -1,8 +0,0 @@ -use serde_yaml; -use std::collections::HashMap; - -#[derive(Debug, Clone, Serialize)] -pub struct HelmResourceScore { - // pub values: serde_yaml, - pub include_CRDs: bool, -} -- 2.39.5 From 2d97cac64b3dad6283569875f942d4ff413b5b5f Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Fri, 18 Apr 2025 10:05:12 -0400 Subject: [PATCH 20/23] Fix compilation errors --- harmony_tui/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/harmony_tui/src/lib.rs b/harmony_tui/src/lib.rs index 11208f0..58b4ab7 100644 --- a/harmony_tui/src/lib.rs +++ b/harmony_tui/src/lib.rs @@ -3,7 +3,7 @@ mod widget; use log::{debug, error, info}; use tokio::sync::mpsc; use tokio_stream::StreamExt; -use tui_logger::{TuiWidgetEvent, TuiWidgetState}; +use tui_logger::{TuiLoggerFile, TuiWidgetEvent, TuiWidgetState}; use widget::{help::HelpWidget, score::ScoreListWidget}; use std::{panic, sync::Arc, time::Duration}; @@ -36,13 +36,13 @@ pub mod tui { /// modules::dummy::{ErrorScore, PanicScore, SuccessScore}, /// topology::HAClusterTopology, /// }; -/// +/// /// #[tokio::main] /// async fn main() { /// let inventory = Inventory::autoload(); /// let topology = HAClusterTopology::autoload(); /// let mut maestro = Maestro::new(inventory, topology); -/// +/// /// maestro.register_all(vec![ /// Box::new(SuccessScore {}), /// Box::new(ErrorScore {}), @@ -123,7 +123,7 @@ impl HarmonyTUI { // Set default level for unknown targets to Trace tui_logger::set_default_level(log::LevelFilter::Info); std::fs::create_dir_all("log")?; - tui_logger::set_log_file("log/harmony.log").unwrap(); + tui_logger::set_log_file(TuiLoggerFile::new("log/harmony.log")); color_eyre::install()?; let mut terminal = ratatui::init(); -- 2.39.5 From 09e61eaabc633610d4168d43edc003075b2bfb5c Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Fri, 18 Apr 2025 21:02:38 -0400 Subject: [PATCH 21/23] extracted test function --- harmony_cli/src/lib.rs | 90 ++++++++---------------------------------- 1 file changed, 16 insertions(+), 74 deletions(-) diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index 675ed67..ee01161 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -148,9 +148,9 @@ mod test { modules::dummy::{ErrorScore, PanicScore, SuccessScore}, topology::HAClusterTopology, }; + use harmony::{score::Score, topology::Topology}; - #[tokio::test] - async fn test_init_success_score() { + fn init_test_maestro() -> Maestro { let inventory = Inventory::autoload(); let topology = HAClusterTopology::autoload(); let mut maestro = Maestro::new(inventory, topology); @@ -161,6 +161,12 @@ mod test { Box::new(PanicScore {}), ]); + maestro + } + + #[tokio::test] + async fn test_init_success_score() { + let maestro = init_test_maestro(); let res = crate::init( maestro, Some(crate::Args { @@ -179,15 +185,7 @@ mod test { #[tokio::test] async fn test_init_error_score() { - let inventory = Inventory::autoload(); - let topology = HAClusterTopology::autoload(); - let mut maestro = Maestro::new(inventory, topology); - - maestro.register_all(vec![ - Box::new(SuccessScore {}), - Box::new(ErrorScore {}), - Box::new(PanicScore {}), - ]); + let maestro = init_test_maestro(); let res = crate::init( maestro, @@ -207,15 +205,7 @@ mod test { #[tokio::test] async fn test_init_number_score() { - let inventory = Inventory::autoload(); - let topology = HAClusterTopology::autoload(); - let mut maestro = Maestro::new(inventory, topology); - - maestro.register_all(vec![ - Box::new(SuccessScore {}), - Box::new(ErrorScore {}), - Box::new(PanicScore {}), - ]); + let maestro = init_test_maestro(); let res = crate::init( maestro, @@ -235,15 +225,7 @@ mod test { #[tokio::test] async fn test_filter_fn_all() { - let inventory = Inventory::autoload(); - let topology = HAClusterTopology::autoload(); - let mut maestro = Maestro::new(inventory, topology); - - maestro.register_all(vec![ - Box::new(SuccessScore {}), - Box::new(ErrorScore {}), - Box::new(PanicScore {}), - ]); + let maestro = init_test_maestro(); let res = crate::maestro_scores_filter(&maestro, true, None, 0); @@ -252,15 +234,7 @@ mod test { #[tokio::test] async fn test_filter_fn_all_success() { - let inventory = Inventory::autoload(); - let topology = HAClusterTopology::autoload(); - let mut maestro = Maestro::new(inventory, topology); - - maestro.register_all(vec![ - Box::new(SuccessScore {}), - Box::new(ErrorScore {}), - Box::new(PanicScore {}), - ]); + let maestro = init_test_maestro(); let res = crate::maestro_scores_filter(&maestro, true, Some("Success".to_owned()), 0); @@ -276,15 +250,7 @@ mod test { #[tokio::test] async fn test_filter_fn_all_error() { - let inventory = Inventory::autoload(); - let topology = HAClusterTopology::autoload(); - let mut maestro = Maestro::new(inventory, topology); - - maestro.register_all(vec![ - Box::new(SuccessScore {}), - Box::new(ErrorScore {}), - Box::new(PanicScore {}), - ]); + let maestro = init_test_maestro(); let res = crate::maestro_scores_filter(&maestro, true, Some("Error".to_owned()), 0); @@ -300,15 +266,7 @@ mod test { #[tokio::test] async fn test_filter_fn_all_score() { - let inventory = Inventory::autoload(); - let topology = HAClusterTopology::autoload(); - let mut maestro = Maestro::new(inventory, topology); - - maestro.register_all(vec![ - Box::new(SuccessScore {}), - Box::new(ErrorScore {}), - Box::new(PanicScore {}), - ]); + let maestro = init_test_maestro(); let res = crate::maestro_scores_filter(&maestro, true, Some("Score".to_owned()), 0); @@ -330,15 +288,7 @@ mod test { #[tokio::test] async fn test_filter_fn_number() { - let inventory = Inventory::autoload(); - let topology = HAClusterTopology::autoload(); - let mut maestro = Maestro::new(inventory, topology); - - maestro.register_all(vec![ - Box::new(SuccessScore {}), - Box::new(ErrorScore {}), - Box::new(PanicScore {}), - ]); + let maestro = init_test_maestro(); let res = crate::maestro_scores_filter(&maestro, false, None, 0); @@ -356,15 +306,7 @@ mod test { #[tokio::test] async fn test_filter_fn_number_invalid() { - let inventory = Inventory::autoload(); - let topology = HAClusterTopology::autoload(); - let mut maestro = Maestro::new(inventory, topology); - - maestro.register_all(vec![ - Box::new(SuccessScore {}), - Box::new(ErrorScore {}), - Box::new(PanicScore {}), - ]); + let maestro = init_test_maestro(); let res = crate::maestro_scores_filter(&maestro, false, None, 11); -- 2.39.5 From 122c75f4beba759091d4f2f477fac7012cdcc3b9 Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Fri, 18 Apr 2025 21:11:41 -0400 Subject: [PATCH 22/23] fix comments --- harmony_cli/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index ee01161..bd10c0d 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -53,8 +53,8 @@ fn maestro_scores_filter( let mut scores_vec: Vec>> = match filter { Some(f) => scores_read .iter() - .map(|s| s.clone_box()) .filter(|s| s.name().contains(&f)) + .map(|s| s.clone_box()) .collect(), None => scores_read.iter().map(|s| s.clone_box()).collect(), }; @@ -113,7 +113,7 @@ pub async fn init( return Ok(()); } - // if no score to run provided, and list isn't specified, print help + // prompt user if --yes is not specified if !args.yes { let confirmation = Confirm::new( format!( @@ -131,7 +131,7 @@ pub async fn init( } } - // if all is specified, run all. Otherwise, run the first match or specified index + // Run filtered scores for s in scores_vec { println!("Running: {}", s.name()); maestro.interpret(s).await?; -- 2.39.5 From 8c7f7471b22d9ea818c21a38df636a49157d427b Mon Sep 17 00:00:00 2001 From: Taha Hawa Date: Fri, 18 Apr 2025 21:12:41 -0400 Subject: [PATCH 23/23] add TODO --- harmony_cli/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/harmony_cli/src/lib.rs b/harmony_cli/src/lib.rs index bd10c0d..3d1bd72 100644 --- a/harmony_cli/src/lib.rs +++ b/harmony_cli/src/lib.rs @@ -70,6 +70,7 @@ fn maestro_scores_filter( return scores_vec; } +// TODO: consider adding doctest for this function fn list_scores_with_index( scores_vec: &Vec>>, ) -> String { -- 2.39.5