Crates.io | proc-macro-rules |
lib.rs | proc-macro-rules |
version | 0.4.0 |
source | src |
created_at | 2019-01-05 01:51:49.036077 |
updated_at | 2023-11-07 03:11:28.551343 |
description | Emulate macro-rules pattern matching in procedural macros |
homepage | |
repository | https://github.com/nrc/proc-macro-rules |
max_upload_size | |
id | 105573 |
size | 17,827 |
macro_rules
-style syntax matching for procedural macros.
This crate is work-in-progress, incomplete, and probably buggy!
Example:
rules!(tokens => {
($finish:ident ($($found:ident)*) # [ $($inner:tt)* ] $($rest:tt)*) => {
for f in found {
do_something(finish, f, inner, rest[0]);
}
}
(foo $($bar:expr)?) => {
match bar {
Some(e) => foo_with_expr(e),
None => foo_no_expr(),
}
}
});
Add proc-macro-rules = "0.3.0"
(or proc-macro-rules = "0.2.1"
for versions between 1.31 and 1.56) to your Cargo.toml.
Import the rules
macro with use proc_macro_rules::rules
, then use with rules!(tokens => { branches });
where tokens
is an expression which evaluates to a TokenStream
(such as the argument in the definition of a procedural macro).
Each branch in branches
should have the form ( pattern ) => { body }
where pattern
is a macro-rules-style pattern (using all the same syntax for meta-variables, AST nodes, repetition, etc.) and body
is rust code executed when the pattern is matched. Within body
, any meta-variables in the pattern are bound to variables of an appropriate type from either the proc_macro2 or syn crates. Where a meta-variable is inside a repetition or option clause, it will be wrapped in a Vec
or Option
, respectively.
For example, in the first branch in the above example ident
has type syn::Ident
and inner
has type Vec<proc_macro2::TokenTree>
.
Use cargo build
to build, cargo test --all
to test.
Contributions are very welcome! It would be great to know things which are missing or incorrect (in general we should have the same behaviour as macro_rules
, so anything different is incorrect). Issues, code, docs, tests, and corrections are all welcome.