From 5f645f884d8d4599702e05d9a5fc370256e1aa8b Mon Sep 17 00:00:00 2001 From: Jonathan Agmon Date: Mon, 23 Mar 2026 17:57:42 +0200 Subject: [PATCH] feat(cli)!: convert update subcommand to --update flag BREAKING CHANGE: The 'update' subcommand is replaced with flags: - Use '--update' to update all cached repositories - Use '--update --repo owner/repo' to update a specific repo - Searching for 'update' keyword now works: 'gh-celebs update' --- src/cli.rs | 23 +++++++++-------------- src/main.rs | 53 +++++++++++++++++++++++++---------------------------- 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index f76a395..b703320 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,13 +1,10 @@ -use clap::{Parser, Subcommand}; +use clap::Parser; #[derive(Parser)] #[command(name = "gh-celebs")] #[command(about = "A fast CLI tool for searching GitHub repositories by popularity")] #[command(version)] pub struct Cli { - #[command(subcommand)] - pub command: Option, - #[arg(help = "Search query", value_name = "QUERY")] pub query: Option, @@ -16,15 +13,13 @@ pub struct Cli { #[arg(long, help = "Output results as JSON")] pub json: bool, -} -#[derive(Subcommand)] -pub enum Commands { - #[command(about = "Update cached repositories")] - Update { - #[arg( - help = "Repository to update (format: owner/repo). If not specified, updates all cached repos." - )] - repo: Option, - }, + #[arg(long, help = "Update cached repositories")] + pub update: bool, + + #[arg( + long, + help = "Repository to update (format: owner/repo). Requires --update" + )] + pub repo: Option, } diff --git a/src/main.rs b/src/main.rs index fd1fc90..01a9212 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,7 +11,7 @@ use clap::Parser; use directories::ProjectDirs; use std::path::PathBuf; -use crate::cli::{Cli, Commands}; +use crate::cli::Cli; use crate::config::Config; use crate::db::Database; use crate::github::GitHubClient; @@ -51,38 +51,35 @@ async fn main() -> Result<()> { let github = GitHubClient::new(config.github.token)?; let search_engine = SearchEngine::new(db, github); - match cli.command { - Some(Commands::Update { repo }) => { - if let Some(repo_name) = repo { - let rate_limit = search_engine.update_single(&repo_name).await?; - if rate_limit.remaining < 3 { - eprintln!("Warning: Rate limit running low ({} remaining)", rate_limit.remaining); - } - } else { - let rate_limit = search_engine.update_all().await?; - if rate_limit.remaining < 3 { - eprintln!("Warning: Rate limit running low ({} remaining)", rate_limit.remaining); - } + if cli.update { + if let Some(repo_name) = cli.repo { + let rate_limit = search_engine.update_single(&repo_name).await?; + if rate_limit.remaining < 3 { + eprintln!("Warning: Rate limit running low ({} remaining)", rate_limit.remaining); + } + } else { + let rate_limit = search_engine.update_all().await?; + if rate_limit.remaining < 3 { + eprintln!("Warning: Rate limit running low ({} remaining)", rate_limit.remaining); } } - None => { - let query = cli.query.ok_or_else(|| { - anyhow::anyhow!("Query is required when not using a subcommand") - })?; + } else { + let query = cli.query.ok_or_else(|| { + anyhow::anyhow!("Query is required. Use --update to update cached repositories.") + })?; - let response = search_engine.search(&query, cli.limit).await?; + let response = search_engine.search(&query, cli.limit).await?; - if cli.json { - let json = OutputFormatter::format_json(&response)?; - println!("{}", json); - } else { - let text = OutputFormatter::format_text(&response)?; - println!("{}", text); - } + if cli.json { + let json = OutputFormatter::format_json(&response)?; + println!("{}", json); + } else { + let text = OutputFormatter::format_text(&response)?; + println!("{}", text); + } - if response.api_remaining < 3 { - eprintln!("Warning: GitHub API rate limit running low ({} remaining)", response.api_remaining); - } + if response.api_remaining < 3 { + eprintln!("Warning: GitHub API rate limit running low ({} remaining)", response.api_remaining); } }