use crate::exceptions::TemplateEngineException;
pub type EngineProcessableResult = Result<bool, Box<dyn TemplateEngineException>>;
pub trait IEngineProcessable {
fn process(&mut self) -> EngineProcessableResult;
}
#[cfg(test)]
mod tests {
use super::IEngineProcessable;
struct AlternatingProcessable {
calls: usize,
}
impl IEngineProcessable for AlternatingProcessable {
fn process(&mut self) -> super::EngineProcessableResult {
self.calls += 1;
Ok(self.calls.is_multiple_of(2))
}
}
#[test]
fn supports_stateful_dynamic_dispatch_without_thread_safety_constraints() {
let mut processable = AlternatingProcessable { calls: 0 };
let dynamic: &mut dyn IEngineProcessable = &mut processable;
assert!(!dynamic.process().expect("first"));
assert!(dynamic.process().expect("second"));
assert!(!dynamic.process().expect("third"));
assert!(dynamic.process().expect("fourth"));
assert_eq!(processable.calls, 4);
}
}