lemma/evaluation/
explanation.rs1use 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}