Skip to main content

contract_cli/commands/
pack.rs

1use crate::cli::PackCmd;
2use crate::clauses;
3use crate::error::Result;
4use crate::output::{print_success, Ctx};
5
6pub fn run(cmd: PackCmd, ctx: Ctx) -> Result<()> {
7    match cmd {
8        PackCmd::List => {
9            let mut packs = clauses::list_packs();
10            packs.sort();
11            print_success(ctx, &packs, |ps| {
12                if ps.is_empty() {
13                    println!("(no packs)");
14                } else {
15                    println!("  Kind        Pack");
16                    for (k, p) in ps {
17                        println!("  {:<12} {}", k, p);
18                    }
19                }
20            });
21            Ok(())
22        }
23        PackCmd::Show { kind, pack } => {
24            let p = clauses::load_pack(&kind, &pack)?;
25            #[derive(serde::Serialize)]
26            struct View {
27                kind: String,
28                pack: String,
29                name: String,
30                version: String,
31                default_clauses: Vec<String>,
32                all_clauses: Vec<(String, String)>,
33            }
34            let mut all_clauses: Vec<(String, String)> = p
35                .clauses
36                .iter()
37                .map(|(slug, def)| (slug.clone(), def.heading.clone()))
38                .collect();
39            all_clauses.sort();
40            let view = View {
41                kind: p.pack.kind.clone(),
42                pack: p.pack.slug.clone(),
43                name: p.pack.name.clone(),
44                version: p.pack.version.clone(),
45                default_clauses: p.pack.default_clauses.clone(),
46                all_clauses,
47            };
48            print_success(ctx, &view, |v| {
49                println!("{} — {} (v{})", v.kind, v.name, v.version);
50                println!("Default order:");
51                for (i, s) in v.default_clauses.iter().enumerate() {
52                    println!("  {:>2}. {}", i + 1, s);
53                }
54                println!("\nAll available clauses:");
55                for (slug, heading) in &v.all_clauses {
56                    println!("  {:<22} {}", slug, heading);
57                }
58            });
59            Ok(())
60        }
61    }
62}