Skip to main content

lemma/evaluation/
explanation.rs

1use crate::evaluation::operations::{ComputationKind, OperationResult};
2use crate::planning::semantics::{FactPath, LiteralValue, RulePath, Source};
3use serde::{Serialize, Serializer};
4use std::sync::Arc;
5
6fn serialize_arc<T, S>(value: &Arc<T>, serializer: S) -> Result<S::Ok, S::Error>
7where
8    T: Serialize,
9    S: Serializer,
10{
11    value.as_ref().serialize(serializer)
12}
13
14#[derive(Debug, Clone, Serialize)]
15pub struct Explanation {
16    pub rule_path: RulePath,
17    pub source: Option<Source>,
18    pub result: OperationResult,
19    #[serde(serialize_with = "serialize_arc")]
20    pub tree: Arc<ExplanationNode>,
21}
22
23#[derive(Debug, Clone, Serialize)]
24#[serde(rename_all = "snake_case")]
25pub enum ExplanationNode {
26    Value {
27        value: LiteralValue,
28        source: ValueSource,
29        source_location: Option<Source>,
30    },
31    RuleReference {
32        rule_path: RulePath,
33        result: OperationResult,
34        source_location: Option<Source>,
35        #[serde(serialize_with = "serialize_arc")]
36        expansion: Arc<ExplanationNode>,
37    },
38    Computation {
39        kind: ComputationKind,
40        original_expression: String,
41        expression: String,
42        result: LiteralValue,
43        source_location: Option<Source>,
44        operands: Vec<ExplanationNode>,
45    },
46    Branches {
47        matched: Box<Branch>,
48        non_matched: Vec<NonMatchedBranch>,
49        source_location: Option<Source>,
50    },
51    Condition {
52        original_expression: String,
53        expression: String,
54        result: bool,
55        source_location: Option<Source>,
56        operands: Vec<ExplanationNode>,
57    },
58    Veto {
59        message: Option<String>,
60        source_location: Option<Source>,
61    },
62}
63
64#[derive(Debug, Clone, Serialize)]
65#[serde(rename_all = "snake_case")]
66pub enum ValueSource {
67    Fact { fact_ref: FactPath },
68    Literal,
69    Computed,
70}
71
72#[derive(Debug, Clone, Serialize)]
73pub struct Branch {
74    pub condition: Option<Box<ExplanationNode>>,
75    pub result: Box<ExplanationNode>,
76    pub clause_index: Option<usize>,
77    pub source_location: Option<Source>,
78}
79
80#[derive(Debug, Clone, Serialize)]
81pub struct NonMatchedBranch {
82    pub condition: Box<ExplanationNode>,
83    pub result: Option<Box<ExplanationNode>>,
84    pub clause_index: Option<usize>,
85    pub source_location: Option<Source>,
86}