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 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}