cargo_generate/
favorites.rs1use 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}