summaryrefslogtreecommitdiffstats
path: root/vendor/jsonpath_lib/src/parser/path_reader.rs
blob: 8147f554d9e11fb45855f7c28bf42395ed368b64 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
use std::result::Result;

#[derive(Debug, PartialEq)]
pub enum ReaderError {
    Eof,
}

pub struct PathReader<'a> {
    input: &'a str,
    pos: usize,
}

impl<'a> PathReader<'a> {
    pub fn new(input: &'a str) -> Self {
        PathReader { input, pos: 0 }
    }

    pub fn peek_char(&self) -> Result<(usize, char), ReaderError> {
        let ch = self.input.chars().next().ok_or(ReaderError::Eof)?;
        Ok((self.pos + ch.len_utf8(), ch))
    }

    pub fn take_while<F>(&mut self, fun: F) -> Result<(usize, String), ReaderError>
    where
        F: Fn(&char) -> bool,
    {
        let mut char_len: usize = 0;
        let mut ret = String::new();
        for c in self.input.chars().by_ref() {
            if !fun(&c) {
                break;
            }
            char_len += c.len_utf8();
            ret.push(c);
        }

        self.pos += char_len;
        self.input = &self.input[char_len..];
        Ok((self.pos, ret))
    }

    pub fn next_char(&mut self) -> Result<(usize, char), ReaderError> {
        let (_, ch) = self.peek_char()?;
        self.input = &self.input[ch.len_utf8()..];
        let ret = Ok((self.pos, ch));
        self.pos += ch.len_utf8();
        ret
    }

    pub fn current_pos(&self) -> usize {
        self.pos
    }
}