From 2ef796ed1133d317d02681456a8d6b84c4c549f6 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Mon, 12 Jan 2026 18:05:42 -0500 Subject: [PATCH 1/3] chore(shared): cli-utils styles --- crates/shared/cli-utils/src/lib.rs | 3 ++ crates/shared/cli-utils/src/runtime.rs | 70 ++++++++++++++------------ crates/shared/cli-utils/src/styles.rs | 24 +++++++++ 3 files changed, 65 insertions(+), 32 deletions(-) create mode 100644 crates/shared/cli-utils/src/styles.rs diff --git a/crates/shared/cli-utils/src/lib.rs b/crates/shared/cli-utils/src/lib.rs index fe92be91..817c3f8c 100644 --- a/crates/shared/cli-utils/src/lib.rs +++ b/crates/shared/cli-utils/src/lib.rs @@ -20,3 +20,6 @@ pub use version::Version; mod runtime; pub use runtime::{build_runtime, run_until_ctrl_c, run_until_ctrl_c_fallible}; + +mod styles; +pub use styles::CliStyles; diff --git a/crates/shared/cli-utils/src/runtime.rs b/crates/shared/cli-utils/src/runtime.rs index ac2b61e4..f8af5368 100644 --- a/crates/shared/cli-utils/src/runtime.rs +++ b/crates/shared/cli-utils/src/runtime.rs @@ -2,42 +2,48 @@ use std::future::Future; -/// Builds a multi-threaded Tokio runtime with all features enabled. -pub fn build_runtime() -> eyre::Result { - tokio::runtime::Builder::new_multi_thread() - .enable_all() - .build() - .map_err(|e| eyre::eyre!("Failed to build tokio runtime: {}", e)) -} +/// A runtime manager. +#[derive(Debug, Clone, Copy)] +pub struct RuntimeManager; + +impl RuntimeManager { + /// Builds a multi-threaded Tokio runtime with all features enabled. + pub fn build_runtime() -> eyre::Result { + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .map_err(|e| eyre::eyre!("Failed to build tokio runtime: {}", e)) + } -/// Runs a future to completion, returning early on Ctrl+C. -pub async fn run_until_ctrl_c(fut: F) -> eyre::Result<()> -where - F: Future, -{ - let ctrl_c = async { - tokio::signal::ctrl_c().await.expect("Failed to install Ctrl+C handler"); - }; + /// Runs a future to completion, returning early on Ctrl+C. + pub async fn run_until_ctrl_c(fut: F) -> eyre::Result<()> + where + F: Future, + { + let ctrl_c = async { + tokio::signal::ctrl_c().await.expect("Failed to install Ctrl+C handler"); + }; - tokio::select! { - biased; - () = ctrl_c => Ok(()), - () = fut => Ok(()), + tokio::select! { + biased; + () = ctrl_c => Ok(()), + () = fut => Ok(()), + } } -} -/// Runs a fallible future to completion, returning early on Ctrl+C. -pub async fn run_until_ctrl_c_fallible(fut: F) -> eyre::Result<()> -where - F: Future>, -{ - let ctrl_c = async { - tokio::signal::ctrl_c().await.expect("Failed to install Ctrl+C handler"); - }; + /// Runs a fallible future to completion, returning early on Ctrl+C. + pub async fn run_until_ctrl_c_fallible(fut: F) -> eyre::Result<()> + where + F: Future>, + { + let ctrl_c = async { + tokio::signal::ctrl_c().await.expect("Failed to install Ctrl+C handler"); + }; - tokio::select! { - biased; - () = ctrl_c => Ok(()), - result = fut => result, + tokio::select! { + biased; + () = ctrl_c => Ok(()), + result = fut => result, + } } } diff --git a/crates/shared/cli-utils/src/styles.rs b/crates/shared/cli-utils/src/styles.rs new file mode 100644 index 00000000..0f8009b6 --- /dev/null +++ b/crates/shared/cli-utils/src/styles.rs @@ -0,0 +1,24 @@ +//! Cli styles for [clap]. + +use clap::builder::{ + Styles, + styling::{AnsiColor, Color, Style}, +}; + +/// A wrapper type for CLI styles. +#[derive(Debug, Clone, Copy)] +pub struct CliStyles; + +impl CliStyles { + /// Initialize the CLI styles, returning a [`Styles`] instance. + pub const fn init() -> Styles { + clap::builder::Styles::styled() + .usage(Style::new().bold().underline().fg_color(Some(Color::Ansi(AnsiColor::Yellow)))) + .header(Style::new().bold().underline().fg_color(Some(Color::Ansi(AnsiColor::Yellow)))) + .literal(Style::new().fg_color(Some(Color::Ansi(AnsiColor::Green)))) + .invalid(Style::new().bold().fg_color(Some(Color::Ansi(AnsiColor::Red)))) + .error(Style::new().bold().fg_color(Some(Color::Ansi(AnsiColor::Red)))) + .valid(Style::new().bold().underline().fg_color(Some(Color::Ansi(AnsiColor::Green)))) + .placeholder(Style::new().fg_color(Some(Color::Ansi(AnsiColor::White)))) + } +} From 3987c5e4137d8f0f3e213ff26284a0bc37298631 Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Mon, 12 Jan 2026 18:16:51 -0500 Subject: [PATCH 2/3] chore: use blue for placeholder style Addresses review feedback to include blue in CLI styling. --- crates/shared/cli-utils/src/styles.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/shared/cli-utils/src/styles.rs b/crates/shared/cli-utils/src/styles.rs index 0f8009b6..12f27572 100644 --- a/crates/shared/cli-utils/src/styles.rs +++ b/crates/shared/cli-utils/src/styles.rs @@ -19,6 +19,6 @@ impl CliStyles { .invalid(Style::new().bold().fg_color(Some(Color::Ansi(AnsiColor::Red)))) .error(Style::new().bold().fg_color(Some(Color::Ansi(AnsiColor::Red)))) .valid(Style::new().bold().underline().fg_color(Some(Color::Ansi(AnsiColor::Green)))) - .placeholder(Style::new().fg_color(Some(Color::Ansi(AnsiColor::White)))) + .placeholder(Style::new().fg_color(Some(Color::Ansi(AnsiColor::Blue)))) } } From 19cb4c2d8a8b08c2c50c7aa44bd137b43e86d46e Mon Sep 17 00:00:00 2001 From: Andreas Bigger Date: Mon, 12 Jan 2026 18:22:21 -0500 Subject: [PATCH 3/3] fix(shared): runtime --- crates/shared/cli-utils/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/shared/cli-utils/src/lib.rs b/crates/shared/cli-utils/src/lib.rs index 817c3f8c..e7053816 100644 --- a/crates/shared/cli-utils/src/lib.rs +++ b/crates/shared/cli-utils/src/lib.rs @@ -19,7 +19,7 @@ mod version; pub use version::Version; mod runtime; -pub use runtime::{build_runtime, run_until_ctrl_c, run_until_ctrl_c_fallible}; +pub use runtime::RuntimeManager; mod styles; pub use styles::CliStyles;