aiken/crates/uplc/src/machine/eval_result.rs

62 lines
1.7 KiB
Rust

use super::{cost_model::ExBudget, Error};
use crate::ast::{Constant, NamedDeBruijn, Term};
#[derive(Debug)]
pub struct EvalResult {
result: Result<Term<NamedDeBruijn>, Error>,
remaining_budget: ExBudget,
initial_budget: ExBudget,
logs: Vec<String>,
}
impl EvalResult {
pub fn new(
result: Result<Term<NamedDeBruijn>, Error>,
remaining_budget: ExBudget,
initial_budget: ExBudget,
logs: Vec<String>,
) -> 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<String> {
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)) || matches!(con.as_ref(), Constant::Unit)
)
}
}
#[allow(clippy::result_unit_err)]
pub fn unwrap_constant(self) -> Result<Constant, ()> {
match self.result {
Ok(Term::Constant(cst)) => Ok(cst.as_ref().to_owned()),
_ => Err(()),
}
}
pub fn result(&self) -> Result<Term<NamedDeBruijn>, Error> {
self.result.clone()
}
}