(&mut self)
| 171 | } |
| 172 | |
| 173 | fn parse_value(&mut self) -> Option<Value> { |
| 174 | let token = self.scanner.current; |
| 175 | self.scanner.advance(); |
| 176 | match token.kind { |
| 177 | TokenType::String => Some(Value::String(token.lexeme.to_owned())), |
| 178 | TokenType::Number => { |
| 179 | let num_str = token.lexeme; |
| 180 | // First try parsing as i64 (integer) |
| 181 | if let Ok(int_val) = num_str.parse::<i64>() { |
| 182 | Some(Value::Number(serde_json::Number::from(int_val))) |
| 183 | } else { |
| 184 | // If not an integer, try as f64 (float) |
| 185 | match num_str.parse::<f64>() { |
| 186 | Ok(float_val) => match serde_json::Number::from_f64(float_val) { |
| 187 | Some(num) => Some(Value::Number(num)), |
| 188 | None => { |
| 189 | self.scanner.error("Invalid float value"); |
| 190 | None |
| 191 | } |
| 192 | }, |
| 193 | Err(err) => { |
| 194 | self.scanner.error(&format!("Invalid number: {err}")); |
| 195 | None |
| 196 | } |
| 197 | } |
| 198 | } |
| 199 | } |
| 200 | TokenType::True => Some(Value::Bool(true)), |
| 201 | TokenType::False => Some(Value::Bool(false)), |
| 202 | TokenType::OpenBracket => { |
| 203 | let values = self.parse_array()?; |
| 204 | Some(Value::Array(values)) |
| 205 | } |
| 206 | _ => { |
| 207 | self.scanner |
| 208 | .error(&format!("Unexpected token {:?}", token.kind)); |
| 209 | None |
| 210 | } |
| 211 | } |
| 212 | } |
| 213 | } |
| 214 | |
| 215 | #[cfg(test)] |
no test coverage detected