1#[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#[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}