-
Notifications
You must be signed in to change notification settings - Fork 19
Closed
Labels
Description
I need a parser with multiple branches. My first attempt was:
or(i, parser! { string(b"ERROR"); ret LogLevel::Error }, |i| {
or(i, parser! { string(b"WARN"); ret LogLevel::Warn }, |i| {
or(i,
parser! { string(b"INFO"); ret LogLevel::Info },
parser! { string(b"DEBUG"); ret LogLevel::Debug })
})
})It works, but it feels too verbose, so I tried to write this macro:
macro_rules! alt {
($i:expr, $a:expr) => { $a };
($i:expr, $a:expr, $b:expr) => { or($i, $a, $b) };
($i:expr, $a:expr, $($b:expr),*) => { or($i, $a, |i| alt!(i, $($b),*)) };
}Now, the parser looks much better:
alt!(i,
{ parser! { string(b"ERROR"); ret LogLevel::Error } },
{ parser! { string(b"WARN"); ret LogLevel::Warn } },
{ parser! { string(b"INFO"); ret LogLevel::Info } },
{ parser! { string(b"DEBUG"); ret LogLevel::Debug } }
)I have some questions:
- Is this a good solution? Is there any alternative?
- Can you include something like this in the crate? I think that more people will need a multi-or combinator.
Thanks!