2019-03-15 15:11:31 +00:00
|
|
|
use crate::value::Value;
|
2016-11-16 16:12:26 +00:00
|
|
|
|
2019-03-15 15:11:31 +00:00
|
|
|
#[derive(Debug, PartialEq)]
|
|
|
|
pub enum Error {
|
|
|
|
WrongArgumentAmount {
|
|
|
|
expected: usize,
|
|
|
|
actual: usize,
|
|
|
|
},
|
|
|
|
ExpectedNumber {
|
|
|
|
actual: Value,
|
|
|
|
},
|
2016-11-16 16:12:26 +00:00
|
|
|
|
2019-03-15 15:11:31 +00:00
|
|
|
/// The given expression is empty
|
|
|
|
EmptyExpression,
|
2016-11-16 16:12:26 +00:00
|
|
|
|
2019-03-15 15:11:31 +00:00
|
|
|
/// Tried to evaluate the root node.
|
|
|
|
/// The root node should only be used as dummy node.
|
|
|
|
EvaluatedRootNode,
|
|
|
|
|
|
|
|
/// Tried to append a child to a leaf node.
|
|
|
|
/// Leaf nodes cannot have children.
|
|
|
|
AppendedToLeafNode,
|
|
|
|
|
|
|
|
/// Tried to append a child to a node such that the precedence of the child is not higher.
|
|
|
|
PrecedenceViolation,
|
|
|
|
|
|
|
|
/// An identifier operation did not find its value in the configuration.
|
|
|
|
IdentifierNotFound,
|
2019-03-15 15:40:38 +00:00
|
|
|
|
|
|
|
/// A value has the wrong type.
|
|
|
|
TypeError,
|
2019-03-15 16:27:10 +00:00
|
|
|
|
|
|
|
/// An opening brace without a matching closing brace was found.
|
|
|
|
UnmatchedLBrace,
|
|
|
|
|
|
|
|
/// A closing brace without a matching opening brace was found.
|
|
|
|
UnmatchedRBrace,
|
2019-03-15 15:11:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Error {
|
|
|
|
pub fn wrong_argument_amount(actual: usize, expected: usize) -> Self {
|
|
|
|
Error::WrongArgumentAmount { actual, expected }
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn expected_number(actual: Value) -> Self {
|
|
|
|
Error::ExpectedNumber { actual }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn expect_argument_amount(actual: usize, expected: usize) -> Result<(), Error> {
|
|
|
|
if actual == expected {
|
|
|
|
Ok(())
|
|
|
|
} else {
|
|
|
|
Err(Error::wrong_argument_amount(actual, expected))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-15 15:40:38 +00:00
|
|
|
pub fn expect_number(actual: &Value) -> Result<(), Error> {
|
2019-03-15 15:11:31 +00:00
|
|
|
match actual {
|
2019-03-15 15:40:38 +00:00
|
|
|
Value::Float(_) | Value::Int(_) => Ok(()),
|
2019-03-15 15:11:31 +00:00
|
|
|
_ => Err(Error::expected_number(actual.clone())),
|
2016-11-16 16:12:26 +00:00
|
|
|
}
|
|
|
|
}
|