use super::{cost_model::ExBudget, Error}; use crate::ast::{Constant, NamedDeBruijn, Term}; #[derive(Debug)] pub struct EvalResult { result: Result, Error>, remaining_budget: ExBudget, initial_budget: ExBudget, logs: Vec, } impl EvalResult { pub fn new( result: Result, Error>, remaining_budget: ExBudget, initial_budget: ExBudget, logs: Vec, ) -> EvalResult { EvalResult { result, remaining_budget, initial_budget, logs, } } pub fn cost(&self) -> ExBudget { self.initial_budget - self.remaining_budget } pub fn logs(&mut self) -> Vec { std::mem::take(&mut self.logs) } pub fn failed(&self, can_error: bool) -> bool { if can_error { self.result.is_ok() && !matches!(self.result, Ok(Term::Constant(ref con)) if matches!(con.as_ref(), Constant::Bool(false))) } else { self.result.is_err() || matches!(self.result, Ok(Term::Error)) || !matches!(self.result, Ok(Term::Constant(ref con)) if matches!(con.as_ref(), Constant::Bool(true))) } } #[allow(clippy::result_unit_err)] pub fn unwrap_constant(self) -> Result { match self.result { Ok(Term::Constant(cst)) => Ok(cst.as_ref().to_owned()), _ => Err(()), } } pub fn result(&self) -> Result, Error> { self.result.clone() } }