use std::mem;
use toasty_core::stmt::{self, Expr};
pub(super) fn fold_expr_and(expr: &mut stmt::ExprAnd) -> Option<Expr> {
for i in 0..expr.operands.len() {
if let Expr::And(and) = &mut expr.operands[i] {
let mut nested = mem::take(&mut and.operands);
expr.operands[i] = true.into();
expr.operands.append(&mut nested);
}
}
if expr.operands.iter().any(|e| e.is_false()) {
return Some(false.into());
}
expr.operands.retain(|operand| !operand.is_true());
if !expr.operands.is_empty() && expr.operands.iter().all(|e| e.is_value_null()) {
return Some(Expr::null());
}
if expr.operands.is_empty() {
Some(true.into())
} else if expr.operands.len() == 1 {
Some(expr.operands.remove(0))
} else {
None
}
}