use serde::{Deserialize, Serialize};
use crate::{Context, Criterion, FactId, TypesIntentConstraint};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TruthKind {
Job,
Policy,
Invariant,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TruthDefinition {
pub key: String,
pub kind: TruthKind,
pub summary: String,
pub success_criteria: Vec<Criterion>,
pub constraints: Vec<TypesIntentConstraint>,
pub approval_points: Vec<String>,
pub participating_packs: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum CriterionResult {
Met { evidence: Vec<FactId> },
Blocked {
reason: String,
approval_ref: Option<String>,
},
Unmet { reason: String },
Indeterminate,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CriterionOutcome {
pub criterion: Criterion,
pub result: CriterionResult,
}
pub trait CriterionEvaluator: Send + Sync {
fn evaluate(&self, criterion: &Criterion, context: &Context) -> CriterionResult;
}
pub trait TruthCatalog: Send + Sync {
fn list_truths(&self) -> Vec<TruthDefinition>;
fn find_truth(&self, key: &str) -> Option<TruthDefinition> {
self.list_truths()
.into_iter()
.find(|truth| truth.key == key)
}
}