noa_parser/bytes/primitives/
whitespace.rs

1//! Recognize whitespaces
2
3use crate::bytes::token::Token;
4use crate::errors::{ParseError, ParseResult};
5use crate::recognizer::Recognizable;
6use crate::scanner::Scanner;
7use crate::visitor::Visitor;
8
9/// Recognize at least one whitespace
10pub struct Whitespaces;
11
12/// Recognize zero or more whitespaces
13pub struct OptionalWhitespaces;
14
15impl<'a> Visitor<'a, u8> for Whitespaces {
16    fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
17        let mut found = false;
18        while Token::Whitespace.recognize(scanner)?.is_some() {
19            found = true;
20        }
21        if !found {
22            return Err(ParseError::UnexpectedToken);
23        }
24        Ok(Whitespaces)
25    }
26}
27
28impl<'a> Visitor<'a, u8> for OptionalWhitespaces {
29    fn accept(scanner: &mut Scanner<'a, u8>) -> ParseResult<Self> {
30        if scanner.is_empty() {
31            return Ok(OptionalWhitespaces);
32        }
33        while Token::Whitespace.recognize(scanner)?.is_some() {}
34        Ok(OptionalWhitespaces)
35    }
36}