beans/
utilities.rs

1/// `int_err` generates an internal error.
2#[macro_export]
3macro_rules! int_err {
4    () => {
5	int_err!("anonymous internal error")
6    };
7    ($msg: literal, $($tks: tt),*) => {{
8	$crate::error::Error::InternalError {
9	    message: format!($msg, $($tks),*)
10	}
11    }};
12}
13
14/// `retrieve!` consumes a builder by fetching `resource` and returning owned.
15#[macro_export]
16macro_rules! retrieve {
17    ($resource: expr) => {{
18        let result = std::mem::replace(&mut $resource, None).ok_or(
19            $crate::error::Error::new($crate::error::ErrorKind::InternalError {
20                message: format!("{} missing", stringify!($resource)),
21            }),
22        )?;
23        result
24    }};
25}
26
27#[macro_export]
28macro_rules! unwrap_or_continue {
29    ($value:expr) => {
30        if let Some(content) = $value {
31            content
32        } else {
33            continue;
34        }
35    };
36}
37
38#[macro_export]
39macro_rules! error {
40    ($($tok:tt)*) => {{
41	eprintln!(
42	    "File \"{}\", line {}, character {}:\nInternal error:",
43	    ::std::file!(),
44	    ::std::line!(),
45	    ::std::column!(),
46	);
47	eprintln!($($tok)*);
48	::std::process::exit(2);
49    }};
50}
51
52#[macro_export]
53macro_rules! get {
54    ($node:expr => $key:literal) => {{
55        $node.attributes.remove($key).unwrap_or_else(|| {
56            $crate::error!("expected to find child {}, got\n{:?}", $key, $node,)
57        })
58    }};
59}
60
61#[macro_export]
62macro_rules! node {
63    ($node:expr) => {
64        if let $crate::parser::AST::Node {
65            attributes, span, ..
66        } = $node
67        {
68            $crate::parser::AstNode { attributes, span }
69        } else {
70            $crate::error!("expected to find node");
71        }
72    };
73}
74
75#[macro_export]
76macro_rules! value {
77    ($node:expr => $key:literal) => {
78        if let $crate::parser::AST::Literal {
79            value: $crate::parser::Value::Str(result),
80            ..
81        } = get!($node => $key)
82        {
83            result
84        } else {
85            error!("expected to find value, got\n{:?}", $node)
86        }
87    };
88}