contract-cli 0.2.1

Beautiful contracts from the CLI — NDA, NCNDA, consulting, MSA, SOW, service, loan. Plain English, 1-3 pages, agent-friendly.
Documentation
use crate::cli::PackCmd;
use crate::clauses;
use crate::error::Result;
use crate::output::{print_success, Ctx};

pub fn run(cmd: PackCmd, ctx: Ctx) -> Result<()> {
    match cmd {
        PackCmd::List => {
            let mut packs = clauses::list_packs();
            packs.sort();
            print_success(ctx, &packs, |ps| {
                if ps.is_empty() {
                    println!("(no packs)");
                } else {
                    println!("  Kind        Pack");
                    for (k, p) in ps {
                        println!("  {:<12} {}", k, p);
                    }
                }
            });
            Ok(())
        }
        PackCmd::Show { kind, pack } => {
            let p = clauses::load_pack(&kind, &pack)?;
            #[derive(serde::Serialize)]
            struct View {
                kind: String,
                pack: String,
                name: String,
                version: String,
                default_clauses: Vec<String>,
                all_clauses: Vec<(String, String)>,
            }
            let mut all_clauses: Vec<(String, String)> = p
                .clauses
                .iter()
                .map(|(slug, def)| (slug.clone(), def.heading.clone()))
                .collect();
            all_clauses.sort();
            let view = View {
                kind: p.pack.kind.clone(),
                pack: p.pack.slug.clone(),
                name: p.pack.name.clone(),
                version: p.pack.version.clone(),
                default_clauses: p.pack.default_clauses.clone(),
                all_clauses,
            };
            print_success(ctx, &view, |v| {
                println!("{}{} (v{})", v.kind, v.name, v.version);
                println!("Default order:");
                for (i, s) in v.default_clauses.iter().enumerate() {
                    println!("  {:>2}. {}", i + 1, s);
                }
                println!("\nAll available clauses:");
                for (slug, heading) in &v.all_clauses {
                    println!("  {:<22} {}", slug, heading);
                }
            });
            Ok(())
        }
    }
}