1use std::ops::RangeInclusive;
9
10use crate::{
11 token::PartialToken,
12 value::{
13 numeric_types::{default_numeric_types::DefaultNumericTypes, EvalexprNumericTypes},
14 value_type::ValueType,
15 },
16};
17
18use crate::{operator::Operator, value::Value};
19
20#[cfg(not(tarpaulin_include))]
22mod display;
23
24#[derive(Debug, Clone, PartialEq)]
26#[non_exhaustive]
27pub enum EvalexprError<NumericTypes: EvalexprNumericTypes = DefaultNumericTypes> {
28 WrongOperatorArgumentAmount {
30 expected: usize,
32 actual: usize,
34 },
35
36 WrongFunctionArgumentAmount {
38 expected: RangeInclusive<usize>,
40 actual: usize,
42 },
43
44 ExpectedString {
46 actual: Value<NumericTypes>,
48 },
49
50 ExpectedInt {
52 actual: Value<NumericTypes>,
54 },
55
56 ExpectedFloat {
58 actual: Value<NumericTypes>,
60 },
61
62 ExpectedNumber {
65 actual: Value<NumericTypes>,
67 },
68
69 ExpectedNumberOrString {
72 actual: Value<NumericTypes>,
74 },
75
76 ExpectedBoolean {
78 actual: Value<NumericTypes>,
80 },
81
82 ExpectedTuple {
84 actual: Value<NumericTypes>,
86 },
87
88 ExpectedFixedLengthTuple {
90 expected_length: usize,
92 actual: Value<NumericTypes>,
94 },
95
96 ExpectedRangedLengthTuple {
98 expected_length: RangeInclusive<usize>,
100 actual: Value<NumericTypes>,
102 },
103
104 ExpectedEmpty {
106 actual: Value<NumericTypes>,
108 },
109
110 AppendedToLeafNode,
113
114 PrecedenceViolation,
118
119 VariableIdentifierNotFound(String),
121
122 FunctionIdentifierNotFound(String),
124
125 TypeError {
128 expected: Vec<ValueType>,
130 actual: Value<NumericTypes>,
132 },
133
134 WrongTypeCombination {
136 operator: Operator<NumericTypes>,
138 actual: Vec<ValueType>,
140 },
141
142 UnmatchedLBrace,
144
145 UnmatchedRBrace,
147
148 UnmatchedDoubleQuote,
150
151 MissingOperatorOutsideOfBrace,
154
155 UnmatchedPartialToken {
159 first: PartialToken<NumericTypes>,
161 second: Option<PartialToken<NumericTypes>>,
163 },
164
165 AdditionError {
167 augend: Value<NumericTypes>,
169 addend: Value<NumericTypes>,
171 },
172
173 SubtractionError {
175 minuend: Value<NumericTypes>,
177 subtrahend: Value<NumericTypes>,
179 },
180
181 NegationError {
183 argument: Value<NumericTypes>,
185 },
186
187 MultiplicationError {
189 multiplicand: Value<NumericTypes>,
191 multiplier: Value<NumericTypes>,
193 },
194
195 DivisionError {
197 dividend: Value<NumericTypes>,
199 divisor: Value<NumericTypes>,
201 },
202
203 ModulationError {
205 dividend: Value<NumericTypes>,
207 divisor: Value<NumericTypes>,
209 },
210
211 InvalidRegex {
213 regex: String,
215 message: String,
217 },
218
219 ContextNotMutable,
221
222 IllegalEscapeSequence(String),
224
225 BuiltinFunctionsCannotBeEnabled,
227
228 BuiltinFunctionsCannotBeDisabled,
230
231 OutOfBoundsAccess,
233
234 IntFromUsize {
236 usize_int: usize,
238 },
239
240 IntIntoUsize {
242 int: NumericTypes::Int,
244 },
245
246 RandNotEnabled,
248
249 CustomMessage(String),
251}
252
253impl<NumericTypes: EvalexprNumericTypes> EvalexprError<NumericTypes> {
254 pub fn wrong_operator_argument_amount(actual: usize, expected: usize) -> Self {
256 EvalexprError::WrongOperatorArgumentAmount { actual, expected }
257 }
258
259 pub fn wrong_function_argument_amount(actual: usize, expected: usize) -> Self {
261 EvalexprError::WrongFunctionArgumentAmount {
262 actual,
263 expected: expected..=expected,
264 }
265 }
266
267 pub fn wrong_function_argument_amount_range(
269 actual: usize,
270 expected: RangeInclusive<usize>,
271 ) -> Self {
272 EvalexprError::WrongFunctionArgumentAmount { actual, expected }
273 }
274
275 pub fn type_error(actual: Value<NumericTypes>, expected: Vec<ValueType>) -> Self {
277 EvalexprError::TypeError { actual, expected }
278 }
279
280 pub fn wrong_type_combination(
282 operator: Operator<NumericTypes>,
283 actual: Vec<ValueType>,
284 ) -> Self {
285 EvalexprError::WrongTypeCombination { operator, actual }
286 }
287
288 pub fn expected_string(actual: Value<NumericTypes>) -> Self {
290 EvalexprError::ExpectedString { actual }
291 }
292
293 pub fn expected_int(actual: Value<NumericTypes>) -> Self {
295 EvalexprError::ExpectedInt { actual }
296 }
297
298 pub fn expected_float(actual: Value<NumericTypes>) -> Self {
300 EvalexprError::ExpectedFloat { actual }
301 }
302
303 pub fn expected_number(actual: Value<NumericTypes>) -> Self {
305 EvalexprError::ExpectedNumber { actual }
306 }
307
308 pub fn expected_number_or_string(actual: Value<NumericTypes>) -> Self {
310 EvalexprError::ExpectedNumberOrString { actual }
311 }
312
313 pub fn expected_boolean(actual: Value<NumericTypes>) -> Self {
315 EvalexprError::ExpectedBoolean { actual }
316 }
317
318 pub fn expected_tuple(actual: Value<NumericTypes>) -> Self {
320 EvalexprError::ExpectedTuple { actual }
321 }
322
323 pub fn expected_fixed_len_tuple(expected_len: usize, actual: Value<NumericTypes>) -> Self {
325 EvalexprError::ExpectedFixedLengthTuple {
326 expected_length: expected_len,
327 actual,
328 }
329 }
330
331 pub fn expected_ranged_len_tuple(
333 expected_len: RangeInclusive<usize>,
334 actual: Value<NumericTypes>,
335 ) -> Self {
336 EvalexprError::ExpectedRangedLengthTuple {
337 expected_length: expected_len,
338 actual,
339 }
340 }
341
342 pub fn expected_empty(actual: Value<NumericTypes>) -> Self {
344 EvalexprError::ExpectedEmpty { actual }
345 }
346
347 pub(crate) fn expected_type(
349 expected: &Value<NumericTypes>,
350 actual: Value<NumericTypes>,
351 ) -> Self {
352 match ValueType::from(expected) {
353 ValueType::String => Self::expected_string(actual),
354 ValueType::Int => Self::expected_int(actual),
355 ValueType::Float => Self::expected_float(actual),
356 ValueType::Boolean => Self::expected_boolean(actual),
357 ValueType::Tuple => Self::expected_tuple(actual),
358 ValueType::Empty => Self::expected_empty(actual),
359 }
360 }
361
362 pub(crate) fn unmatched_partial_token(
363 first: PartialToken<NumericTypes>,
364 second: Option<PartialToken<NumericTypes>>,
365 ) -> Self {
366 EvalexprError::UnmatchedPartialToken { first, second }
367 }
368
369 pub(crate) fn addition_error(augend: Value<NumericTypes>, addend: Value<NumericTypes>) -> Self {
370 EvalexprError::AdditionError { augend, addend }
371 }
372
373 pub(crate) fn subtraction_error(
374 minuend: Value<NumericTypes>,
375 subtrahend: Value<NumericTypes>,
376 ) -> Self {
377 EvalexprError::SubtractionError {
378 minuend,
379 subtrahend,
380 }
381 }
382
383 pub(crate) fn negation_error(argument: Value<NumericTypes>) -> Self {
384 EvalexprError::NegationError { argument }
385 }
386
387 pub(crate) fn multiplication_error(
388 multiplicand: Value<NumericTypes>,
389 multiplier: Value<NumericTypes>,
390 ) -> Self {
391 EvalexprError::MultiplicationError {
392 multiplicand,
393 multiplier,
394 }
395 }
396
397 pub(crate) fn division_error(
398 dividend: Value<NumericTypes>,
399 divisor: Value<NumericTypes>,
400 ) -> Self {
401 EvalexprError::DivisionError { dividend, divisor }
402 }
403
404 pub(crate) fn modulation_error(
405 dividend: Value<NumericTypes>,
406 divisor: Value<NumericTypes>,
407 ) -> Self {
408 EvalexprError::ModulationError { dividend, divisor }
409 }
410
411 pub fn invalid_regex(regex: String, message: String) -> Self {
413 EvalexprError::InvalidRegex { regex, message }
414 }
415}
416
417pub(crate) fn expect_operator_argument_amount<NumericTypes: EvalexprNumericTypes>(
419 actual: usize,
420 expected: usize,
421) -> EvalexprResult<(), NumericTypes> {
422 if actual == expected {
423 Ok(())
424 } else {
425 Err(EvalexprError::wrong_operator_argument_amount(
426 actual, expected,
427 ))
428 }
429}
430
431pub fn expect_function_argument_amount<NumericTypes: EvalexprNumericTypes>(
433 actual: usize,
434 expected: usize,
435) -> EvalexprResult<(), NumericTypes> {
436 if actual == expected {
437 Ok(())
438 } else {
439 Err(EvalexprError::wrong_function_argument_amount(
440 actual, expected,
441 ))
442 }
443}
444
445pub fn expect_number_or_string<NumericTypes: EvalexprNumericTypes>(
447 actual: &Value<NumericTypes>,
448) -> EvalexprResult<(), NumericTypes> {
449 match actual {
450 Value::String(_) | Value::Float(_) | Value::Int(_) => Ok(()),
451 _ => Err(EvalexprError::expected_number_or_string(actual.clone())),
452 }
453}
454
455impl<NumericTypes: EvalexprNumericTypes> std::error::Error for EvalexprError<NumericTypes> {}
456
457pub type EvalexprResult<T, NumericTypes = DefaultNumericTypes> =
459 Result<T, EvalexprError<NumericTypes>>;
460
461pub type EvalexprResultValue<NumericTypes = DefaultNumericTypes> =
463 EvalexprResult<Value<NumericTypes>, NumericTypes>;
464
465#[cfg(test)]
466mod tests {
467 use crate::{
468 value::numeric_types::default_numeric_types::DefaultNumericTypes, EvalexprError, Value,
469 ValueType,
470 };
471
472 #[test]
474 fn trivial_coverage_tests() {
475 assert_eq!(
476 EvalexprError::type_error(
477 Value::<DefaultNumericTypes>::Int(3),
478 vec![ValueType::String]
479 ),
480 EvalexprError::TypeError {
481 actual: Value::Int(3),
482 expected: vec![ValueType::String]
483 }
484 );
485 assert_eq!(
486 EvalexprError::expected_type(
487 &Value::<DefaultNumericTypes>::String("abc".to_string()),
488 Value::Empty
489 ),
490 EvalexprError::expected_string(Value::Empty)
491 );
492 assert_eq!(
493 EvalexprError::expected_type(
494 &Value::<DefaultNumericTypes>::Boolean(false),
495 Value::Empty
496 ),
497 EvalexprError::expected_boolean(Value::Empty)
498 );
499 assert_eq!(
500 EvalexprError::expected_type(
501 &Value::<DefaultNumericTypes>::Tuple(vec![]),
502 Value::Empty
503 ),
504 EvalexprError::expected_tuple(Value::Empty)
505 );
506 assert_eq!(
507 EvalexprError::expected_type(
508 &Value::<DefaultNumericTypes>::Empty,
509 Value::String("abc".to_string())
510 ),
511 EvalexprError::expected_empty(Value::String("abc".to_string()))
512 );
513 }
514}