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 };
}