Get example working
This commit is contained in:
parent
20a8f12160
commit
fbea2a40c3
16
Cargo.lock
generated
16
Cargo.lock
generated
@ -838,6 +838,21 @@ dependencies = [
|
|||||||
name = "example"
|
name = "example"
|
||||||
version = "0.0.0"
|
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]]
|
[[package]]
|
||||||
name = "example-kube-rs"
|
name = "example-kube-rs"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@ -1212,6 +1227,7 @@ version = "0.1.0"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"harmony",
|
"harmony",
|
||||||
|
"harmony_tui",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
18
examples/cli/Cargo.toml
Normal file
18
examples/cli/Cargo.toml
Normal file
@ -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 }
|
||||||
20
examples/cli/src/main.rs
Normal file
20
examples/cli/src/main.rs
Normal file
@ -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();
|
||||||
|
}
|
||||||
@ -8,3 +8,8 @@ license.workspace = true
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
clap = { version = "4.5.35", features = ["derive"] }
|
clap = { version = "4.5.35", features = ["derive"] }
|
||||||
harmony = { path = "../harmony" }
|
harmony = { path = "../harmony" }
|
||||||
|
harmony_tui = { path = "../harmony_tui", optional = true }
|
||||||
|
|
||||||
|
|
||||||
|
[features]
|
||||||
|
tui = ["dep:harmony_tui"]
|
||||||
|
|||||||
88
harmony_cli/src/lib.rs
Normal file
88
harmony_cli/src/lib.rs
Normal file
@ -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<T: Topology + std::fmt::Debug + Send + Sync + 'static>(
|
||||||
|
maestro: harmony::maestro::Maestro<T>,
|
||||||
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
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<Box<dyn Score<T>>> =
|
||||||
|
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(());
|
||||||
|
}
|
||||||
@ -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.
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user