#macro-rules #macro #creation #aid #complex

makero

A macro_rules! macro to aid in the creation of complex macro_rules! macros

3 releases

0.1.2 Sep 11, 2021
0.1.1 Sep 11, 2021
0.1.0 Sep 11, 2021

#1611 in Rust patterns

MIT license

5KB
58 lines

By default, macros are processed top-down; for example, foo!(bar!()) will process the foo macro first, using the literal tokens bar ! ( ), and bar will only be processed if foo outputs those tokens verbatim.

Enter makero. Inside makero blocks, invoked helper macros will be processed bottom-up; the below main macro outputs true, but removing makero would cause it to output false instead, as the is_x macro would see make_x ! ( ) instead of x.

use makero::makero;
makero! {
  macro_rules! main {
    () => { is_x!(make_x!()) };
  }

  macro_rules! is_x {
    (x) => { true };
    ($($x:tt)*) => { false };
  }

  macro_rules! make_x {
    () => { x };
  }
}
let out = main!();
assert_eq!(out, true);

The makero macro accepts one or more macro_rules! items; only the top-most one will be externally visible.

Attributes can be applied to the resulting macro by applying them to the top-most macro_rules! definition.

No runtime deps