main-spex 0.20.0

AI-first development framework that turns specifications into deterministic, verifiable code
use crate::spec::{Spec, Status};

use super::super::finding::{Finding, Location, Source};

#[cfg(test)]
#[path = "status_test.rs"]
mod status_test;

pub(super) fn status_finding(spec: &Spec) -> Option<Finding> {
    let (done, total) = spec.ac_done_total();
    if total == 0 || done != total || spec.status.is_implemented() {
        return None;
    }
    Some(Finding::warn(
        Source::spec(spec.id.as_str(), "status"),
        Some(Location::in_file(&spec.path)),
        format!(
            "every acceptance criterion is done but status is `{}` — set status to active or deprecated",
            spec.status.label()
        ),
    ))
}

pub(super) fn active_incomplete_finding(spec: &Spec) -> Option<Finding> {
    let (done, total) = spec.ac_done_total();
    if spec.status != Status::Active || done == total {
        return None;
    }
    Some(Finding::error(
        Source::spec(spec.id.as_str(), "status"),
        Some(Location::in_file(&spec.path)),
        format!(
            "status is `active` but only {done}/{total} acceptance criteria are done — use `in-progress` until every `is_done: false` is cleared"
        ),
    ))
}