Skip to main content

im_json/
deserializer.rs

1pub struct Deserializer<'a> {
2    current_pos: usize,
3    s: &'a str,
4}
5
6impl<'a> Deserializer<'a> {
7    pub fn new(s: &str) -> Deserializer {
8        Deserializer { current_pos: 0, s }
9    }
10
11    pub fn get_next_token(&mut self) -> Option<&str> {
12        if self.current_pos == self.s.len() {
13            return None;
14        }
15
16        // Skip WhiteSpace
17        if self.current_char().is_ascii_whitespace() {
18            let advance = self.seek_none_whitespace(self.current_pos + 1);
19            self.current_pos += advance + 1;
20        }
21
22        let current_char = self.current_char();
23        let old_pos = self.current_pos;
24
25        match current_char {
26            b'{' | b'}' | b':' | b'[' | b']' | b',' => {
27                self.current_pos += 1;
28                return Some(&self.s[old_pos..old_pos + 1]);
29            }
30            b'\"' => {
31                let advance = self.seek_str_end(old_pos + 1);
32                self.current_pos += advance + 2;
33                return Some(&self.s[old_pos..self.current_pos]);
34            }
35            _ => {
36                if current_char.is_ascii_digit() {
37                    let advance = self.seek_number_end(old_pos + 1);
38                    self.current_pos += advance + 1;
39                    return Some(&self.s[old_pos..self.current_pos]);
40                }
41            }
42        }
43
44        panic!()
45    }
46
47    pub fn expect_begin_array(&mut self) -> Option<&str> {
48        let str = self.get_next_token();
49        match str {
50            Some("[") => str,
51            _ => None,
52        }
53    }
54
55    pub fn expect_end_array(&mut self) -> Option<&str> {
56        let str = self.get_next_token();
57        match str {
58            Some("]") => str,
59            _ => None,
60        }
61    }
62
63    pub fn expect_i64(&mut self) -> Option<i64> {
64        let str = self.get_next_token()?;
65        if str == "," {
66            self.expect_i64()
67        } else {
68            str.parse::<i64>().ok()
69        }
70    }
71
72    fn current_char(&self) -> u8 {
73        self.s.as_bytes()[self.current_pos]
74    }
75
76    fn seek_str_end(&self, start: usize) -> usize {
77        for (i, c) in self.s.as_bytes()[start..self.s.len()].iter().enumerate() {
78            if *c == b'\"' {
79                return i;
80            }
81        }
82        todo!();
83    }
84
85    fn seek_none_whitespace(&self, start: usize) -> usize {
86        for (i, c) in self.s.as_bytes()[start..self.s.len()].iter().enumerate() {
87            if !c.is_ascii_whitespace() {
88                return i;
89            }
90        }
91        todo!();
92    }
93
94    fn seek_number_end(&self, start: usize) -> usize {
95        for (i, c) in self.s.as_bytes()[start..self.s.len()].iter().enumerate() {
96            if !c.is_ascii_digit() {
97                return i;
98            }
99        }
100        todo!()
101    }
102}