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())),
        }
    }
}