From 8b0d081532df8a1a688a90b98242327388c2d23b Mon Sep 17 00:00:00 2001 From: GeekMasher Date: Mon, 14 Apr 2025 19:47:10 +0100 Subject: [PATCH] feat: Update CLI interface and logging output --- Cargo.lock | 20 ++++++++++++++++++++ Cargo.toml | 2 +- src/cli.rs | 11 +++++++++++ src/interactive.rs | 29 +++++++++++++++++++---------- src/main.rs | 8 +++++++- 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9b5c320..4a141a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -193,6 +193,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" dependencies = [ "console", + "fuzzy-matcher", "shell-words", "tempfile", "thiserror 1.0.69", @@ -250,6 +251,15 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[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 = "getrandom" version = "0.3.2" @@ -737,6 +747,16 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tokio" version = "1.44.2" diff --git a/Cargo.toml b/Cargo.toml index 68587b2..d1aca61 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ default = [] # CLI parser clap = { version = "4.5", features = ["derive", "env"] } console = "0.15" -dialoguer = "0.11" +dialoguer = { version = "0.11", features = ["fuzzy-select"] } indicatif = "0.17" thiserror = "2" anyhow = "1" diff --git a/src/cli.rs b/src/cli.rs index 22488e6..a3357a8 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,5 +1,6 @@ use clap::{Parser, Subcommand}; use console::style; +use std::io::Write; use std::path::PathBuf; pub const VERSION_NUMBER: &str = env!("CARGO_PKG_VERSION"); @@ -85,6 +86,16 @@ pub fn init() -> Arguments { env_logger::builder() .parse_default_env() .filter_level(log_level) + .format(|buf, record| { + let level = match record.level() { + log::Level::Error => style(record.level()).red(), + log::Level::Warn => style(record.level()).yellow(), + log::Level::Info => style(record.level()).blue(), + log::Level::Debug => style(record.level()).cyan(), + log::Level::Trace => style(record.level()).white(), + }; + writeln!(buf, "[{:^5}] {}", level, record.args()) + }) .format_module_path(false) .init(); diff --git a/src/interactive.rs b/src/interactive.rs index 56a9a30..caba305 100644 --- a/src/interactive.rs +++ b/src/interactive.rs @@ -1,21 +1,30 @@ +use crate::config::Config; use crate::{WorkflowMode, config::BumpMode, defaults::Defaults}; use anyhow::{Result, anyhow}; -use dialoguer::Select; +use dialoguer::theme::ColorfulTheme; +use dialoguer::{FuzzySelect, Select}; use log::debug; -pub fn select_mode() -> Result { - let selection = Select::new() +pub fn select_mode(config: &Config) -> Result { + let mut modes = Vec::new(); + if !config.version.is_some() { + modes.push("Init"); + } + modes.push("Display"); + modes.push("Bump"); + + let selection = FuzzySelect::with_theme(&ColorfulTheme::default()) .with_prompt("Select Mode") .default(0) - .item("Init") - .item("Display") - .item("Bump") + .items(modes.as_slice()) .interact()?; - match selection { - 0 => Ok(interactive_init()?), - 1 => Ok(WorkflowMode::Display), - 2 => { + let text = modes.get(selection).ok_or(anyhow!("Invalid selection"))?; + + match *text { + "Init" => Ok(interactive_init()?), + "Display" => Ok(WorkflowMode::Display), + "Bump" => { let bump_mode = select_bump_mode()?; Ok(WorkflowMode::Bump(bump_mode)) } diff --git a/src/main.rs b/src/main.rs index f10cd6d..969205e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ #![deny(unsafe_code)] use anyhow::Result; +use console::style; use defaults::Defaults; use log::debug; use log::info; @@ -94,7 +95,7 @@ async fn main() -> Result<()> { WorkflowMode::Bump(bump_mode) } Some(ArgumentCommands::Display) => WorkflowMode::Display, - None => select_mode()?, + None => select_mode(&config)?, }; let workflow = Workflow::init() @@ -131,6 +132,11 @@ async fn main() -> Result<()> { info!("Configuration saved"); } WorkflowMode::Display => { + info!( + "Current Version - {}", + style(config.version.unwrap_or_default()).green() + ); + workflow.display()?; } WorkflowMode::Bump(mode) => {