noa_parser/bytes/
recognizer.rs

1use crate::errors::{ParseError, ParseResult};
2use crate::matcher::{Match, MatchSize};
3use crate::recognizer::Recognizable;
4use crate::scanner::Scanner;
5
6/// Recognize an object for the given scanner.
7/// Return a slice of the recognized object.
8impl<'a, M: Match<u8> + MatchSize> Recognizable<'a, u8, &'a [u8]> for M {
9    fn recognize(self, scanner: &mut Scanner<'a, u8>) -> ParseResult<Option<&'a [u8]>> {
10        if scanner.is_empty() {
11            return Err(ParseError::UnexpectedEndOfInput);
12        }
13
14        let data = scanner.remaining();
15
16        let (result, size) = self.matcher(data);
17        if !result {
18            return Ok(None);
19        }
20        let curent_position = scanner.current_position();
21        if !scanner.is_empty() {
22            scanner.bump_by(size);
23        }
24        Ok(Some(
25            &scanner.data()[curent_position..curent_position + size],
26        ))
27    }
28}