rgen_cli_lib/cmds/
categories.rs

1use clap::Args;
2use colored::*;
3use rgen_core::RegistryClient;
4use rgen_utils::error::Result;
5
6#[derive(Args, Debug)]
7pub struct CategoriesArgs {
8    /// Show popular keywords instead of categories
9    #[arg(long)]
10    pub keywords: bool,
11
12    /// Show detailed statistics
13    #[arg(short, long)]
14    pub detailed: bool,
15
16    /// Output as JSON
17    #[arg(long)]
18    pub json: bool,
19}
20
21pub async fn run(args: &CategoriesArgs) -> Result<()> {
22    let registry_client = RegistryClient::new()?;
23
24    if args.keywords {
25        let keywords = registry_client.get_popular_keywords().await?;
26        display_keywords(&keywords, args.detailed, args.json)?;
27    } else {
28        let categories = registry_client.get_popular_categories().await?;
29        display_categories(&categories, args.detailed, args.json)?;
30    }
31
32    Ok(())
33}
34
35fn display_categories(categories: &[(String, u64)], detailed: bool, json: bool) -> Result<()> {
36    if json {
37        let json_output = serde_json::to_string_pretty(categories)?;
38        println!("{}", json_output);
39        return Ok(());
40    }
41
42    println!("📂 Popular Categories");
43    println!("===================");
44
45    if detailed {
46        for (i, (category, count)) in categories.iter().enumerate() {
47            println!(
48                "{}. {} ({})",
49                i + 1,
50                category.bold().cyan(),
51                format!("{} templates", count).dimmed()
52            );
53        }
54    } else {
55        let categories_str = categories
56            .iter()
57            .take(10)
58            .map(|(cat, _)| cat.as_str())
59            .collect::<Vec<_>>()
60            .join(", ");
61        println!("{}", categories_str.cyan());
62    }
63
64    Ok(())
65}
66
67fn display_keywords(keywords: &[(String, u64)], detailed: bool, json: bool) -> Result<()> {
68    if json {
69        let json_output = serde_json::to_string_pretty(keywords)?;
70        println!("{}", json_output);
71        return Ok(());
72    }
73
74    println!("🏷️  Popular Keywords");
75    println!("===================");
76
77    if detailed {
78        for (i, (keyword, count)) in keywords.iter().enumerate() {
79            println!(
80                "{}. {} ({})",
81                i + 1,
82                keyword.bold().green(),
83                format!("{} templates", count).dimmed()
84            );
85        }
86    } else {
87        let keywords_str = keywords
88            .iter()
89            .take(15)
90            .map(|(kw, _)| kw.as_str())
91            .collect::<Vec<_>>()
92            .join(", ");
93        println!("{}", keywords_str.green());
94    }
95
96    Ok(())
97}