quick modifier parser macro
This commit is contained in:
parent
f9841267ec
commit
2d5291c07b
4 changed files with 67 additions and 3 deletions
|
@ -15,6 +15,12 @@ pub fn slope_modifier_parser(input: TokenStream) -> TokenStream {
|
|||
impl_slope_modifier_parser(ast)
|
||||
}
|
||||
|
||||
#[proc_macro_derive(QuickModifierParser)]
|
||||
pub fn quick_modifier_parser(input: TokenStream) -> TokenStream {
|
||||
let ast = parse_macro_input!(input as DeriveInput);
|
||||
impl_quick_modifier_parser(ast)
|
||||
}
|
||||
|
||||
fn impl_modifier_parser(ast: DeriveInput) -> TokenStream {
|
||||
let name = &ast.ident;
|
||||
if let Data::Enum(DataEnum { variants, .. }) = ast.data {
|
||||
|
@ -77,3 +83,43 @@ fn impl_slope_modifier_parser(ast: DeriveInput) -> TokenStream {
|
|||
panic!("this macro only works on enums")
|
||||
}
|
||||
}
|
||||
|
||||
fn impl_quick_modifier_parser(ast: DeriveInput) -> TokenStream {
|
||||
let name = &ast.ident;
|
||||
if let Data::Enum(DataEnum { variants, .. }) = ast.data {
|
||||
let match_arms = variants.iter().map(|variant| {
|
||||
let variant_name = &variant.ident;
|
||||
|
||||
quote! {
|
||||
nom::combinator::map(
|
||||
nom::branch::alt(
|
||||
(
|
||||
nom::combinator::value(
|
||||
true,
|
||||
nom::character::complete::char(#name::#variant_name(Default::default()).token()[0])
|
||||
),
|
||||
nom::combinator::value(
|
||||
false,
|
||||
nom::character::complete::char(#name::#variant_name(Default::default()).token()[1])
|
||||
)
|
||||
)
|
||||
),
|
||||
#name::#variant_name
|
||||
)
|
||||
}
|
||||
});
|
||||
|
||||
quote! {
|
||||
impl lex::lexer::Parse for #name {
|
||||
fn parse(input: &str) -> nom::IResult<&str, #name> {
|
||||
nom::branch::alt((
|
||||
#(#match_arms),*
|
||||
))(input)
|
||||
}
|
||||
}
|
||||
}
|
||||
.into()
|
||||
} else {
|
||||
panic!("this macro only works on enums")
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue