cargo_generate/
favorites.rs

1//! Module dealing with <favorite> arg passed to cargo-generate
2
3use crate::{
4    app_config::{app_config_path, AppConfig, FavoriteConfig},
5    emoji, GenerateArgs,
6};
7use anyhow::Result;
8use console::style;
9use log::info;
10
11pub fn list_favorites(args: &GenerateArgs) -> Result<()> {
12    let app_config: AppConfig = app_config_path(&args.config)?.as_path().try_into()?;
13
14    let data = {
15        let mut d = app_config
16            .favorites
17            .as_ref()
18            .map(|h| {
19                h.iter()
20                    .filter(|(key, _)| {
21                        args.template_path
22                            .auto_path()
23                            .is_none_or(|f| key.starts_with(f.as_ref()))
24                    })
25                    .collect::<Vec<(&String, &FavoriteConfig)>>()
26            })
27            .unwrap_or_default();
28        d.sort_by_key(|(key, _)| (*key).to_string());
29        d
30    };
31
32    if data.is_empty() {
33        info!(
34            "{} {}",
35            emoji::WARN,
36            style("No favorites defined").bold().red()
37        );
38        return Ok(());
39    }
40
41    info!("{} {}", emoji::WRENCH, style("Possible favorites:").bold());
42    let longest_key = data.iter().map(|(k, _)| k.len()).max().unwrap_or(0);
43    let longest_key = ((longest_key + 5) / 4) * 4;
44    data.iter().for_each(|(key, conf)| {
45        info!(
46            "    {} {}:{}{}",
47            emoji::DIAMOND,
48            style(key).bold(),
49            " ".repeat(longest_key - key.len()),
50            conf.description
51                .as_ref()
52                .cloned()
53                .unwrap_or_else(|| "no description".into())
54        );
55    });
56    info!("{} {}", emoji::SPARKLE, style("Done").bold().green());
57
58    Ok(())
59}