1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
use crate::should_result::ShouldResult; pub trait AssertionHook { fn create_result(pass: bool, message: String, results: &mut Vec<ShouldResult>); } pub struct NoOpAssertionHook; impl AssertionHook for NoOpAssertionHook { fn create_result(pass: bool, message: String, results: &mut Vec<ShouldResult>) { results.push((pass, message).into()) } } pub struct NotAssertionHook; impl AssertionHook for NotAssertionHook { fn create_result(pass: bool, message: String, results: &mut Vec<ShouldResult>) { results.push((!pass, format!("NOT: {}", message)).into()) } } pub struct OrAssertionHook; impl AssertionHook for OrAssertionHook { fn create_result(pass: bool, message: String, results: &mut Vec<ShouldResult>) { match results.pop() { None => NoOpAssertionHook::create_result(pass, message, results), Some(result) => results.push(result.or((pass, message).into())), } } }