zacor 0.1.0

Package manager and dispatcher for zr — install, manage, and run modular CLI packages
Documentation
use crate::error::*;
use crate::package_definition;
use crate::paths;
use crate::receipt;
use std::path::Path;

pub fn run(home: &Path) -> Result<()> {
    let packages = receipt::list_all(home)?;

    if packages.is_empty() {
        println!("no packages installed");
        return Ok(());
    }

    let mut name_w = 4;
    let mut ver_w = 7;
    for (name, r) in &packages {
        name_w = name_w.max(name.len());
        ver_w = ver_w.max(r.current.len());
    }

    println!(
        "{:<name_w$}  {:<ver_w$}  {:<8}  DESCRIPTION",
        "NAME", "VERSION", "STATUS",
        name_w = name_w, ver_w = ver_w,
    );

    for (name, r) in &packages {
        let status = if r.active { "active" } else { "inactive" };
        let desc = get_description(home, name, &r.current);
        println!(
            "{:<name_w$}  {:<ver_w$}  {:<8}  {}",
            name, r.current, status, desc,
            name_w = name_w, ver_w = ver_w,
        );
    }

    Ok(())
}

fn get_description(home: &Path, name: &str, version: &str) -> String {
    let def_path = paths::definition_path(home, name, version);
    if let Ok(def) = package_definition::parse_file(&def_path) {
        def.description.unwrap_or_default()
    } else {
        String::new()
    }
}