arcature-cli 2026.2.0

Developer lifecycle CLI for Arcature applications.
Documentation
use std::fmt;

use serde::Serialize;

#[derive(Debug, Clone, Copy, Serialize, Eq, PartialEq)]
#[serde(rename_all = "lowercase")]
pub(crate) enum HealthStatus {
    Ok,
    Warning,
    Error,
    Unverified,
}

impl fmt::Display for HealthStatus {
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        formatter.write_str(match self {
            Self::Ok => "OK",
            Self::Warning => "warning",
            Self::Error => "error",
            Self::Unverified => "unverified",
        })
    }
}

#[derive(Debug, Serialize)]
pub(crate) struct HealthItem {
    pub(crate) name: String,
    pub(crate) status: HealthStatus,
    pub(crate) detail: String,
}

#[derive(Debug, Default, Serialize)]
pub(crate) struct HealthReport {
    pub(crate) checks: Vec<HealthItem>,
}

impl HealthReport {
    pub(crate) fn push(
        &mut self,
        name: impl Into<String>,
        status: HealthStatus,
        detail: impl Into<String>,
    ) {
        self.checks.push(HealthItem {
            name: name.into(),
            status,
            detail: detail.into(),
        });
    }
    pub(crate) fn has_error(&self) -> bool {
        self.checks
            .iter()
            .any(|item| item.status == HealthStatus::Error)
    }
    pub(crate) fn print_human(&self) {
        for item in &self.checks {
            println!("{:<10} {:<10} {}", item.name, item.status, item.detail);
        }
    }
    pub(crate) fn print_json(&self) -> Result<(), serde_json::Error> {
        println!("{}", serde_json::to_string_pretty(self)?);
        Ok(())
    }
}