rbe/
deriv_error.rs

1use crate::rbe::Rbe;
2use crate::Bag;
3use crate::Cardinality;
4use serde::{Deserialize, Serialize};
5use std::fmt::Display;
6use std::fmt::Formatter;
7use std::hash::Hash;
8use thiserror::Error;
9
10#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq, Hash)]
11pub struct Failures<A>
12where
13    A: Hash + Eq + Display,
14{
15    fs: Vec<(Box<Rbe<A>>, DerivError<A>)>,
16}
17
18impl<A> Failures<A>
19where
20    A: Hash + Eq + Display,
21{
22    pub fn new() -> Self {
23        Self { fs: Vec::new() }
24    }
25
26    pub fn push(&mut self, expr: Rbe<A>, err: DerivError<A>) {
27        self.fs.push((Box::new(expr), err));
28    }
29}
30
31impl<A> Default for Failures<A>
32where
33    A: Hash + Eq + Display,
34{
35    fn default() -> Self {
36        Self::new()
37    }
38}
39
40impl<A> Display for Failures<A>
41where
42    A: Hash + Eq + Display + Display,
43{
44    fn fmt(&self, dest: &mut Formatter<'_>) -> Result<(), std::fmt::Error> {
45        for (expr, err) in &self.fs {
46            writeln!(dest, "Error at {expr}: {err}")?;
47        }
48        Ok(())
49    }
50}
51
52#[derive(Clone, Debug, Error, Eq, PartialEq, Hash, Serialize, Deserialize)]
53pub enum DerivError<A>
54where
55    A: Hash + PartialEq + Eq + Display,
56{
57    #[error("Symbol {x} doesn't match with empty. Open: {open}")]
58    UnexpectedEmpty { x: A, open: bool },
59
60    #[error("Symbol {x} doesn't match with expected symbol {expected}. Open: {open}")]
61    UnexpectedSymbol { x: A, expected: A, open: bool },
62
63    #[error("Max cardinality 0, but found symbol {x}")]
64    MaxCardinalityZeroFoundValue { x: A },
65
66    // TODO: Maybe this error is redundant?
67    #[error("Negative lower bound: {min}")]
68    RangeNegativeLowerBound { min: usize },
69
70    #[error("Min > Max in cardinality {card} for {symbol}")]
71    RangeLowerBoundBiggerMax { symbol: A, card: Cardinality },
72
73    #[error("Min > Max in cardinality {card} for {expr}")]
74    RangeLowerBoundBiggerMaxExpr {
75        expr: Box<Rbe<A>>,
76        card: Cardinality,
77    },
78
79    #[error("Derived expr: {non_nullable_rbe} is not nullable\nExpr {expr}\nBag: {bag}")]
80    NonNullable {
81        non_nullable_rbe: Box<Rbe<A>>,
82        bag: Bag<A>,
83        expr: Box<Rbe<A>>,
84    },
85
86    #[error("Cardinality failed for symbol {symbol}. Current number: {current_number}, expected cardinality: {expected_cardinality}")]
87    CardinalityFail {
88        symbol: A,
89        expected_cardinality: Cardinality,
90        current_number: usize,
91    },
92
93    #[error("Cardinality failed for expr. Current number: {current_number}, expected cardinality: {expected_cardinality}")]
94    CardinalityFailRepeat {
95        expected_cardinality: Cardinality,
96        current_number: usize,
97    },
98
99    #[error("Cardinality(0,0) but found symbol after derivative")]
100    CardinalityZeroZeroDeriv { symbol: A },
101
102    #[error("Should fail but passed: {name}")]
103    ShouldFailButPassed { name: String },
104
105    #[error("Or values failed {e}\n {failures}")]
106    OrValuesFail {
107        e: Box<Rbe<A>>,
108        failures: Failures<A>,
109    },
110
111    #[error("All values in or branch failed")]
112    MkOrValuesFail,
113
114    #[error("Error matching bag: {error_msg}\nBag: {bag}\nExpr: {expr}\nCurrent:{current}\nValue: {value}\nopen: {open}")]
115    DerivBagError {
116        error_msg: String,
117        processed: Box<Bag<A>>,
118        bag: Box<Bag<A>>,
119        expr: Box<Rbe<A>>,
120        current: Box<Rbe<A>>,
121        value: A,
122        open: bool,
123    },
124}