1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
4pub enum ProbeResult {
5 Pass,
6 Fail,
7 Missing,
8}
9
10#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
11pub struct Witness {
12 pub kind: String,
13 pub evidence: String,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
17pub struct RepairAction {
18 pub id: String,
19 pub title: String,
20 pub next_lawful_step: Option<String>,
21 pub command: Option<String>,
22 pub code_action: Option<String>,
23 pub virtual_doc_uri: Option<String>,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
27pub enum Severity {
28 Info,
29 Warning,
30 Stop,
31 Refuse,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
35pub struct AndonInvariant {
36 pub id: String,
37 pub statement: String,
38 pub scope: String,
39
40 pub true_probe: Option<String>,
41 pub false_probe: Option<String>,
42 pub counterfactual_probe: Option<String>,
43
44 pub witness_rule: Option<String>,
45 pub repair_rule: Option<RepairAction>,
46
47 pub severity: Severity,
48 pub blocks: bool,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct TruthTableRow {
53 pub invariant_id: String,
54 pub true_case: ProbeResult,
55 pub false_case: ProbeResult,
56 pub counterfactual_case: ProbeResult,
57 pub witness: Option<Witness>,
58 pub repair: Option<RepairAction>,
59 pub verdict: ProbeResult,
60 pub admission_allowed: bool,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct TruthTable {
65 pub rows: Vec<TruthTableRow>,
66}
67
68pub struct InvariantRegistry {
69 invariants: Vec<AndonInvariant>,
70}
71
72impl InvariantRegistry {
73 pub fn new() -> Self {
74 Self {
75 invariants: Vec::new(),
76 }
77 }
78
79 pub fn empty() -> Self {
80 Self::new()
81 }
82
83 pub fn register(&mut self, invariant: AndonInvariant) {
84 self.invariants.push(invariant);
85 }
86
87 pub fn get_all(&self) -> &[AndonInvariant] {
88 &self.invariants
89 }
90
91 pub fn is_empty(&self) -> bool {
92 self.invariants.is_empty()
93 }
94}