Macro logos_nom_bridge::data_variant_parser
source · [−]macro_rules! data_variant_parser {
(
fn $fn_name:ident($input:ident) -> Result<$ok_ty:ty>;
pattern = $type:ident :: $variant:ident $data:tt => $res:expr;
) => { ... };
(
fn $fn_name:ident($input:ident) -> Result<$ok_ty:ty, $error_ty:ty $(,)?>;
pattern = $type:ident :: $variant:ident $data:tt => $res:expr;
error = $error:expr;
) => { ... };
(
fn $fn_name:ident<$lt:lifetime>($input:ident) -> Result<$ok_ty:ty, $error_ty:ty $(,)?>;
pattern = $type:ident :: $variant:ident $data:tt => $res:expr;
error = $error:expr;
) => { ... };
}
Expand description
Generates a nom parser function to parse an enum variant that contains data.
Example
#[derive(Clone, Debug, PartialEq, Eq, logos::Logos)]
enum Token {
#[regex(r"-?[0-9]+", |lex| lex.slice().parse())]
Number(i64),
// etc.
}
enum Op {
Number(i64),
// etc.
}
// Parse a `Token::Number` and return it as an `Op::Number`
logos_nom_bridge::data_variant_parser! {
fn parse_number(input) -> Result<Op>;
pattern = Token::Number(n) => Op::Number(n);
}
And with a custom error:
enum MyError {
WrongToken,
// etc.
}
logos_nom_bridge::data_variant_parser! {
fn parse_number(input) -> Result<Op, MyError>;
pattern = Token::Number(n) => Op::Number(n);
error = MyError::WrongToken;
}
It’s possible to store the input in the error:
use logos_nom_bridge::Tokens;
enum MyError<'src> {
WrongToken {
input: Tokens<'src, Token>,
},
// etc.
}
logos_nom_bridge::data_variant_parser! {
fn parse_number<'src>(input) -> Result<Op, MyError<'src>>;
pattern = Token::Number(n) => Op::Number(n);
error = MyError::WrongToken { input };
}