Enum logos::FilterResult
source · pub enum FilterResult<T, E> {
Emit(T),
Skip,
Error(E),
}
Expand description
Type that can be returned from a callback, either producing a field for a token, skipping it, or emitting an error.
Example
use logos::{Logos, FilterResult};
#[derive(Debug, PartialEq, Clone, Default)]
enum LexingError {
NumberParseError,
NumberIsTen,
#[default]
Other,
}
impl From<std::num::ParseIntError> for LexingError {
fn from(_: std::num::ParseIntError) -> Self {
LexingError::NumberParseError
}
}
#[derive(Logos, Debug, PartialEq)]
#[logos(error = LexingError)]
enum Token {
#[regex(r"[ \n\f\t]+", logos::skip)]
Ignored,
#[regex("[0-9]+", |lex| {
let n: u64 = lex.slice().parse().unwrap();
// Only emit a token if `n` is an even number.
if n % 2 == 0 {
// Emit an error if `n` is 10.
if n == 10 {
FilterResult::Error(LexingError::NumberIsTen)
} else {
FilterResult::Emit(n)
}
} else {
FilterResult::Skip
}
})]
NiceEvenNumber(u64)
}
let tokens: Vec<_> = Token::lexer("20 11 42 23 100 10").collect();
assert_eq!(
tokens,
&[
Ok(Token::NiceEvenNumber(20)),
// skipping 11
Ok(Token::NiceEvenNumber(42)),
// skipping 23
Ok(Token::NiceEvenNumber(100)),
// error at 10
Err(LexingError::NumberIsTen),
]
);
Variants§
Emit(T)
Emit a token with a given value T
. Use ()
for unit variants without fields.
Skip
Skip current match, analog to Skip
.
Error(E)
Emit a <Token as Logos>::ERROR
token.
Auto Trait Implementations§
impl<T, E> RefUnwindSafe for FilterResult<T, E>where
E: RefUnwindSafe,
T: RefUnwindSafe,
impl<T, E> Send for FilterResult<T, E>
impl<T, E> Sync for FilterResult<T, E>
impl<T, E> Unpin for FilterResult<T, E>
impl<T, E> UnwindSafe for FilterResult<T, E>where
E: UnwindSafe,
T: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more