use crate::codemap::FileSpanRef;
use crate::eval::Evaluator;
#[derive(Default)]
pub(crate) struct BeforeStmt<'a, 'e: 'a> {
pub(crate) before_stmt: Vec<BeforeStmtFunc<'a, 'e>>,
pub(crate) instrument: bool,
}
#[doc(hidden)]
pub enum BeforeStmtFunc<'a, 'e: 'a> {
Fn(&'a dyn Fn(FileSpanRef, bool, &mut Evaluator<'_, '_, 'e>)),
Dyn(Box<dyn BeforeStmtFuncDyn<'e>>),
}
impl<'a, 'e: 'a> BeforeStmtFunc<'a, 'e> {
pub(crate) fn call<'v>(
&mut self,
span: FileSpanRef,
continued: bool,
eval: &mut Evaluator<'v, 'a, 'e>,
) -> crate::Result<()> {
match self {
BeforeStmtFunc::Fn(f) => {
f(span, continued, eval);
Ok(())
}
BeforeStmtFunc::Dyn(d) => d.call(span, continued, eval),
}
}
pub(crate) fn from_fn(
value: &'a dyn Fn(FileSpanRef, bool, &mut Evaluator<'_, '_, 'e>),
) -> Self {
Self::Fn(value)
}
#[doc(hidden)]
pub fn from_dyn(value: Box<dyn BeforeStmtFuncDyn<'e>>) -> Self {
Self::Dyn(value)
}
}
#[doc(hidden)]
pub trait BeforeStmtFuncDyn<'e> {
#[doc(hidden)]
fn call<'v>(
&mut self,
span: FileSpanRef,
continued: bool,
eval: &mut Evaluator<'v, '_, 'e>,
) -> crate::Result<()>;
}
impl<'a, 'e: 'a> BeforeStmt<'a, 'e> {
pub(crate) fn enabled(&self) -> bool {
self.instrument || !self.before_stmt.is_empty()
}
}