mycelium-manager 0.2.5

A robust, production-grade task/plan manager CLI (binary: myc)
use crate::cli::OutputFormat;
use crate::commands::{ensure_initialized, INFO_PREFIX};
use crate::error::Result;
use colored::Colorize;
use comfy_table::{ContentArrangement, Table};

pub fn execute(format: &OutputFormat, quiet: bool) -> Result<()> {
    let db = ensure_initialized()?;
    let summary = db.get_summary()?;

    if quiet {
        return Ok(());
    }

    match format {
        OutputFormat::Json => println!("{}", serde_json::to_string_pretty(&summary)?),
        OutputFormat::Table => {
            println!("{} Project Summary", INFO_PREFIX.blue());
            println!();

            let mut table = Table::new();
            table.set_content_arrangement(ContentArrangement::Dynamic);
            table.set_header(vec!["Metric", "Count"]);

            table.add_row(vec!["Total Epics", &summary.total_epics.to_string()]);
            table.add_row(vec!["Open Epics", &summary.open_epics.to_string()]);
            table.add_row(vec!["Closed Epics", &summary.closed_epics.to_string()]);
            table.add_row(vec!["", ""]);
            table.add_row(vec!["Total Tasks", &summary.total_tasks.to_string()]);
            table.add_row(vec!["Open Tasks", &summary.open_tasks.to_string()]);
            table.add_row(vec!["Closed Tasks", &summary.closed_tasks.to_string()]);
            table.add_row(vec!["", ""]);
            table.add_row(vec![
                "Overdue Tasks",
                &summary.overdue_tasks.to_string().red().to_string(),
            ]);
            table.add_row(vec![
                "Blocked Tasks",
                &summary.blocked_tasks.to_string().yellow().to_string(),
            ]);

            println!("{}", table);

            if summary.total_tasks > 0 {
                let completion = (summary.closed_tasks * 100 / summary.total_tasks) as f64;
                println!("\nOverall completion: {:.1}%", completion);
            }
        }
    }
    Ok(())
}