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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99


//! # Examples
//!
//! ```rust
//! #[macro_use] extern crate must;
//! use must::prelude::*;
//! # fn main() {
//! // Result and Option has methods for unwrapping.
//! // Results returned from these methods are #[must_use]
//! // and you can get the value by using .or(fail!())
//! let val = Some(5u8).must_be_some()
//!   // fail!() macro captures location.
//!   .or(fail!());
//! val.must_be(5);
//! # }
//! ```
//!
//!
//!
//!
//!




pub mod result;
pub mod marker;
pub mod prelude;
pub mod error_renderer;
pub mod matcher;

///
///
/// fail!() - Just capture source location.
///
/// fail!("") - Add message.
///
/// fail!("{:?}", var) - Add message.
///
#[macro_export]
macro_rules! fail {
    () => {{
        fn fail_with_src(err: &$crate::result::Error) {
            let src = $crate::error_renderer::Source {
                filename: file!(),
                line: line!(),
                column: column!(),
            };

            let renderer = &$crate::error_renderer::ErrRenderer {
			    err: err,
			    src: Some(src),
                msg: None,
		    };
            panic!("{}", renderer);
        }

        fail_with_src
    }};

     ($fmt:expr) => {{
        let f = |ref err: &$crate::result::Error| {
            let src = $crate::error_renderer::Source {
                filename: file!(),
                line: line!(),
                column: column!(),
            };

            let renderer = &$crate::error_renderer::ErrRenderer {
			    err: err,
			    src: Some(src),
                msg: Some(format!($fmt)),
		    };
            panic!("{}", renderer);
        };

        f
    }};

    ($fmt:expr, $($arg:tt)*) => {{
        let f = |ref err: &$crate::result::Error| {
            let src = $crate::error_renderer::Source {
                filename: file!(),
                line: line!(),
                column: column!(),
            };

            let renderer = &$crate::error_renderer::ErrRenderer {
			    err: err,
			    src: Some(src),
                msg: Some(format!($fmt, $($arg)* )),
		    };
            panic!("{}", renderer);
        };

        f
    }};
}