pitchfork-cli 2.13.0

Daemons with DX
Documentation
use axum::response::Json;
use serde::Serialize;

use crate::daemon_id::DaemonId;
use crate::env;
use crate::pitchfork_toml::PitchforkToml;
use crate::state_file::StateFile;

#[derive(Serialize)]
pub struct ApiStats {
    total: usize,
    running: usize,
    stopped: usize,
    errored: usize,
}

pub async fn stats() -> Json<ApiStats> {
    let state = match StateFile::read(&*env::PITCHFORK_STATE_FILE) {
        Ok(s) => s,
        Err(_) => StateFile::new(env::PITCHFORK_STATE_FILE.clone()),
    };

    let pt = match PitchforkToml::all_merged_all_namespaces() {
        Ok(pt) => pt,
        Err(_) => {
            return Json(ApiStats {
                total: 0,
                running: 0,
                stopped: 0,
                errored: 0,
            });
        }
    };

    let pitchfork_id = DaemonId::pitchfork();
    let user_daemons: Vec<_> = state
        .daemons
        .iter()
        .filter(|(id, _)| **id != pitchfork_id)
        .collect();

    let running = user_daemons
        .iter()
        .filter(|(_, d)| d.status.is_running())
        .count();
    let stopped = user_daemons
        .iter()
        .filter(|(_, d)| d.status.is_stopped())
        .count();
    let errored = user_daemons
        .iter()
        .filter(|(_, d)| d.status.is_errored())
        .count();

    let mut all_ids = std::collections::HashSet::new();
    for (id, _) in user_daemons {
        all_ids.insert(id.clone());
    }
    for id in pt.daemons.keys() {
        all_ids.insert(id.clone());
    }
    let total = all_ids.len();

    Json(ApiStats {
        total,
        running,
        stopped,
        errored,
    })
}