Macro hierarchy
macro_rules! hierarchy { (@build $hierarchy:expr,) => { ... }; (@build $hierarchy:expr, var $key:ident: { $($sub:tt)* }) => { ... }; (@build $hierarchy:expr, var $key:ident: { $($sub:tt)* }, $($rest:tt)*) => { ... }; (@build $hierarchy:expr, var $key:ident: $value:expr) => { ... }; (@build $hierarchy:expr, var $key:ident: $value:expr, $($rest:tt)*) => { ... }; (@build $hierarchy:expr, $key:ident: $($rest:tt)+) => { ... }; (@build $hierarchy:expr, $key:tt: $($rest:tt)+) => { ... }; (@build $hierarchy:expr, $key:expr => $value:expr) => { ... }; (@build $hierarchy:expr, $key:expr => $value:expr, $($rest:tt)*) => { ... }; (var $key:ident: { $($rest:tt)* }) => { ... }; ($key:ident: $($rest:tt)+) => { ... }; ($key:tt: $($rest:tt)+) => { ... }; }
Expand description
This macro simplifies creating diagnostics hierarchies, to remove the need of writing multiple nested hierarchies and manually writing all properties.
Example:
let hierarchy = hierarchy!{
root: {
some_int_property: 2,
some_nested_child: {
some_string_property: "foo",
}
}
};
Using names like this will create a DiagnosticsHierarchy
where Key
is of type String
.
It’s possible to use expressions that resolve to some other type. In the following example, we
use Field
variants as the key. The function bar()
returns a Field::Bar
.
enum Field {
Foo,
Bar,
}
let hierarchy = hierarchy!{
root: {
Field::Foo => "bar",
bar() => 2,
}
};
The only requirement (as in any DiagnosticsHierarchy
’s Key
) it must implement AsRef<str>
.
It’s also possible to use existing variables as keys. For example:
let my_var = "my_key".to_string();
let hierarchy = hierarchy!{
root: {
var my_var: "foo",
}
};