1use crate::{ExecutionParameters, Shell, error, extendedtests, extensions};
4
5pub fn eval_expr(
21 expr: &shrub_parser::ast::TestExpr,
22 shell: &mut Shell<impl extensions::ShellExtensions>,
23 params: &ExecutionParameters,
24) -> Result<bool, error::Error> {
25 match expr {
26 shrub_parser::ast::TestExpr::False => Ok(false),
27 shrub_parser::ast::TestExpr::Literal(s) => Ok(!s.is_empty()),
28 shrub_parser::ast::TestExpr::And(left, right) => {
29 Ok(eval_expr(left, shell, params)? && eval_expr(right, shell, params)?)
30 }
31 shrub_parser::ast::TestExpr::Or(left, right) => {
32 Ok(eval_expr(left, shell, params)? || eval_expr(right, shell, params)?)
33 }
34 shrub_parser::ast::TestExpr::Not(expr) => Ok(!eval_expr(expr, shell, params)?),
35 shrub_parser::ast::TestExpr::Parenthesized(expr) => eval_expr(expr, shell, params),
36 shrub_parser::ast::TestExpr::UnaryTest(op, operand) => {
37 extendedtests::apply_unary_predicate_to_str(op, operand, shell, params)
38 }
39 shrub_parser::ast::TestExpr::BinaryTest(op, left, right) => {
40 extendedtests::apply_binary_predicate_to_strs(op, left.as_str(), right.as_str(), shell)
41 }
42 }
43}