[−][src]Crate mquote
This is Rust quasi-quoting library like quote that gives you mquote!
macro providing
several features aimed on better readability and usability. It supports:
- expression insertion
- if/else condition
- for iteration
- matching
- extending
Example
mquote!{ #{if having_fun} fn funny_method() { ... } #{endif} fn regular_method() { ... } };
Crate contains mquote!
and mquote_spanned!
. Usage examples of the first one
are below. The second one allow you to set
span of producing tokens stream by this syntax: mquote_spanned!(span => ...)
.
Expression insertion
Turns given expression into tokens by using ToTokens
.
fn put_filter(enabled: bool) -> proc_macro2::TokenStream { let good_person = Person{ name: "Oleg", age: 20 }; mquote!{ assert!(!#{enabled} || person.name == #{good_person.name} && person.age >= #{good_person.age}) } }
If / elif / else
fn define_container(amount: usize) -> proc_macro2::TokenStream { mquote!{ #{if amount > 1} struct People(Vec<Person>); #{elif amount == 1} struct Human(Person); #{else} struct NoneHuman; #{endif} } }
For
fn define_person(fields: Vec<(Ident, Ident)>) -> proc_macro2::TokenStream { mquote!{ pub struct Person { #{for (name, ty) in fields} #{name}: #{ty} #{endfor} } } }
Matching
fn hardcode_it(var: Ident, value: Option<&str>) -> proc_macro2::TokenStream { mquote!{ static #var: &str = #{match value} #{of Some(x) if x.len() > 0} #{x}; #{of Some(_)} "case for empty strings"; #{of None} "default value"; #{endmatch} } }
Extending
Sometimes you want mquote!
to consume an iterator of TokenTree
s
without cloning. It's possible with special syntax ^{iterable}
that accepts
any IntoIterator<Item=TokenTree>
.
fn assign_by_ref(stream: TokenStream) -> TokenStream { let tail = stream.into_iter().skip(5); // here could be something // more reasonable mquote!{ let _ = ^{tail} } }
Escaping #{}
or ^{}
If you want to put either #{abc}
or ^{abc}
as is, you should double braces:
fn it_works() { let tokens = mquote!(#{{abc}} ^{{abc}}); assert_eq!(tokens.to_string(), "# { abc } ^ { abc }") }
Macros
mquote | Turns given directives into TokenStream. |
mquote_spanned | Same as mquote!, but applies a given span to all tokens originating within the macro invocation. |