use mathexpr::{eval, CompileError, EvalError, Expression, ParseError};
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Error Handling Examples ===\n");
println!("--- Parse Errors ---\n");
match Expression::parse("@#$") {
Ok(_) => println!("Unexpected success"),
Err(ParseError::InvalidSyntax(msg)) => {
println!("ParseError::InvalidSyntax");
println!(" Input: @#$");
println!(" Message: {}\n", msg);
}
Err(e) => println!("Other error: {}", e),
}
match Expression::parse("2 + 3 @") {
Ok(_) => println!("Unexpected success"),
Err(ParseError::UnexpectedTrailingInput(trailing)) => {
println!("ParseError::UnexpectedTrailingInput");
println!(" Input: 2 + 3 @");
println!(" Trailing: '{}'\n", trailing);
}
Err(e) => println!("Other error: {}", e),
}
println!("--- Compile Errors ---\n");
match Expression::parse("x + y")?.compile(&["x"]) {
Ok(_) => println!("Unexpected success"),
Err(CompileError::UndefinedVariable(name)) => {
println!("CompileError::UndefinedVariable");
println!(" Expression: x + y");
println!(" Variables provided: [\"x\"]");
println!(" Undefined: '{}'\n", name);
}
Err(e) => println!("Other error: {}", e),
}
match Expression::parse("foo(5)")?.compile(&[]) {
Ok(_) => println!("Unexpected success"),
Err(CompileError::UnknownFunction(name)) => {
println!("CompileError::UnknownFunction");
println!(" Expression: foo(5)");
println!(" Unknown function: '{}'\n", name);
}
Err(e) => println!("Other error: {}", e),
}
match Expression::parse("sqrt(1, 2)")?.compile(&[]) {
Ok(_) => println!("Unexpected success"),
Err(CompileError::WrongArity {
name,
expected,
got,
}) => {
println!("CompileError::WrongArity");
println!(" Expression: sqrt(1, 2)");
println!(
" Function '{}' expects {} arg(s), got {}\n",
name, expected, got
);
}
Err(e) => println!("Other error: {}", e),
}
println!("--- Eval Errors ---\n");
let expr = Expression::parse("1 / x")?.compile(&["x"])?;
match expr.eval(&[0.0]) {
Ok(_) => println!("Unexpected success"),
Err(EvalError::DivisionByZero) => {
println!("EvalError::DivisionByZero");
println!(" Expression: 1 / x");
println!(" x = 0\n");
}
Err(e) => println!("Other error: {}", e),
}
let expr = Expression::parse("x % y")?.compile(&["x", "y"])?;
match expr.eval(&[10.0, 0.0]) {
Ok(_) => println!("Unexpected success"),
Err(EvalError::DivisionByZero) => {
println!("EvalError::DivisionByZero (modulo)");
println!(" Expression: x % y");
println!(" x = 10, y = 0\n");
}
Err(e) => println!("Other error: {}", e),
}
println!("--- Domain Errors (return NaN, not errors) ---\n");
let result = eval("sqrt(-1)", &[], &[])?;
println!("sqrt(-1) = {}", result);
println!(" Returns NaN, not an error\n");
let result = eval("log(-1)", &[], &[])?;
println!("log(-1) = {}", result);
println!(" Returns NaN, not an error\n");
let result = eval("log(0)", &[], &[])?;
println!("log(0) = {}", result);
println!(" Returns -inf, not an error\n");
let result = eval("asin(2)", &[], &[])?;
println!("asin(2) = {}", result);
println!(" Returns NaN, not an error (|x| > 1)\n");
println!("Done!");
Ok(())
}