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 #[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}