envoy-cli 0.1.6-hotfix

A Git-like CLI for managing encrypted environment files
use crate::utils::{
    manifest::{load_manifest, read_applied},
    project_config::load_project_config,
    ui::{print_header, print_info, print_kv, print_success, print_warn},
};
use console::style;
use std::path::Path;

pub fn status() -> anyhow::Result<()> {
    let project = load_project_config()?;

    print_header("Envoy Status");

    let latest = match std::fs::read_to_string(".envoy/latest") {
        Ok(v) => v.trim().to_string(),
        Err(_) => {
            print_kv("Project:", &project.project_id);
            print_info("Manifest: none");
            println!();
            print_warn("State: EMPTY");
            print_info(&format!("Run {}", style("`envy push`").cyan()));
            return Ok(());
        }
    };

    let manifest_path = format!(".envoy/cache/{}.blob", latest);

    if !Path::new(&manifest_path).exists() {
        println!();
        print_kv("Project:", &project.project_id);
        print_warn("Manifest blob missing locally");
        print_warn("State: OUT OF SYNC");
        print_info(&format!("Run {}", style("`envy pull`").cyan()));
        return Ok(());
    }

    let manifest = load_manifest()?;

    let applied = read_applied();
    print_kv("Project:", &project.project_id);
    print_kv("Manifest:", &latest[..12]);

    if let Some(ref applied) = applied {
        print_kv("Applied:", &applied[..12]);
    }

    let mut missing = 0;

    for hash in manifest.files.values() {
        let path = Path::new(".envoy/cache").join(format!("{}.blob", hash));
        if !path.exists() {
            missing += 1;
        }
    }

    let is_applied = applied.as_deref() == Some(&latest);
    let has_all_blobs = missing == 0;

    println!();

    if !has_all_blobs {
        print_warn("State: OUT OF SYNC (missing data)");
        print_info(&format!("Run {}", style("`envy pull`").cyan()));
    } else if !is_applied {
        print_warn("State: OUT OF SYNC (not applied)");
        print_info(&format!("Run {}", style("`envy pull`").cyan()));
    } else {
        print_success("State: UP TO DATE");
    }

    Ok(())
}