Skip to main content

lsp_max/andon/
core.rs

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}