main-spex 0.26.0

AI-first development framework that turns specifications into verified code
use std::collections::HashSet;

use crate::spec::{AcId, Spec};

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

const DUPLICATE_AC_ID_CHECK: &str = "no-duplicate-ac-ids";

pub(super) fn validate_no_duplicate_ac_ids(specs: &[Spec]) -> Vec<Finding> {
    let mut findings = Vec::new();
    for spec in specs {
        let mut seen: HashSet<&AcId> = HashSet::new();
        for ac in &spec.acceptance_criteria {
            if !seen.insert(&ac.id) {
                findings.push(conformance_error(
                    DUPLICATE_AC_ID_CHECK,
                    Some(Location::at_line(&spec.path, ac.line)),
                    format!(
                        "duplicate acceptance criterion id `{}` within this spec",
                        ac.id
                    ),
                ));
            }
        }
    }
    findings
}