(&mut self)
| 150 | } |
| 151 | |
| 152 | fn read_number(&mut self) -> Result<Token, JsonError> { |
| 153 | let start = self.pos; |
| 154 | let mut is_float = false; |
| 155 | if self.src[self.pos] == b'-' { self.pos += 1; } |
| 156 | while self.pos < self.src.len() && self.src[self.pos].is_ascii_digit() { self.pos += 1; } |
| 157 | if self.pos < self.src.len() && self.src[self.pos] == b'.' { |
| 158 | is_float = true; |
| 159 | self.pos += 1; |
| 160 | while self.pos < self.src.len() && self.src[self.pos].is_ascii_digit() { self.pos += 1; } |
| 161 | } |
| 162 | if self.pos < self.src.len() && matches!(self.src[self.pos], b'e' | b'E') { |
| 163 | is_float = true; |
| 164 | self.pos += 1; |
| 165 | if self.pos < self.src.len() && matches!(self.src[self.pos], b'+' | b'-') { self.pos += 1; } |
| 166 | while self.pos < self.src.len() && self.src[self.pos].is_ascii_digit() { self.pos += 1; } |
| 167 | } |
| 168 | let text = core::str::from_utf8(&self.src[start..self.pos]).map_err(|_| self.err("non-utf8 number"))?.to_string(); |
| 169 | if is_float { |
| 170 | text.parse::<f64>().map(|f| Token::Float(f, text.clone())).map_err(|_| JsonError { msg: "invalid float".to_string(), pos: start }) |
| 171 | } else { |
| 172 | text.parse::<i128>().map(|i| Token::Int(i, text.clone())).map_err(|_| JsonError { msg: "integer overflow".to_string(), pos: start }) |
| 173 | } |
| 174 | } |
| 175 | } |
| 176 | |
| 177 | fn utf8_len(b: u8) -> Option<usize> { |
no test coverage detected