contract_cli/commands/
pack.rs1use 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}