use serde::{Deserialize, Serialize};
#[derive(
Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize,
)]
#[serde(rename_all = "kebab-case")]
pub enum ContractKind {
#[default]
Kernel,
Registry,
ModelFamily,
ModelFamilyVariant,
Tokenizer,
TrainingLoop,
PretrainingCorpus,
TrainingPreconditionGate,
CorpusAssembly,
Pattern,
Schema,
BeatBenchmark,
}
impl std::fmt::Display for ContractKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let s = match self {
Self::Kernel => "kernel",
Self::Registry => "registry",
Self::ModelFamily => "model-family",
Self::ModelFamilyVariant => "model-family-variant",
Self::Tokenizer => "tokenizer",
Self::TrainingLoop => "training-loop",
Self::PretrainingCorpus => "pretraining-corpus",
Self::TrainingPreconditionGate => "training-precondition-gate",
Self::CorpusAssembly => "corpus-assembly",
Self::Pattern => "pattern",
Self::Schema => "schema",
Self::BeatBenchmark => "beat-benchmark",
};
write!(f, "{s}")
}
}
#[cfg(test)]
mod beat_benchmark_tests {
use super::*;
use crate::error::Severity;
use crate::schema::{parse_contract_str, validate_contract};
#[test]
fn beat_benchmark_kind_round_trips() {
assert_eq!(ContractKind::BeatBenchmark.to_string(), "beat-benchmark");
let k: ContractKind = serde_yaml::from_str("beat-benchmark").unwrap();
assert_eq!(k, ContractKind::BeatBenchmark);
}
#[test]
fn pilot_beat_contract_validates() {
let yaml = include_str!("../../../../contracts/beat-sklearn-iris-v1.yaml");
let contract = parse_contract_str(yaml).expect("pilot beat contract parses");
assert_eq!(contract.kind(), ContractKind::BeatBenchmark);
let errors: Vec<_> = validate_contract(&contract)
.into_iter()
.filter(|v| v.severity == Severity::Error)
.collect();
assert!(
errors.is_empty(),
"pilot beat contract has errors: {errors:?}"
);
}
}