From fa65142861d256e1c12c225e22ac2e13914b7fbb Mon Sep 17 00:00:00 2001 From: "Anna (navi) Figueiredo Gomes" Date: Sat, 14 Oct 2023 10:28:30 +0100 Subject: tmp --- src/json.rs | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/json.rs (limited to 'src/json.rs') diff --git a/src/json.rs b/src/json.rs new file mode 100644 index 0000000..8151212 --- /dev/null +++ b/src/json.rs @@ -0,0 +1,70 @@ +#![allow(dead_code)] +use std::collections::HashMap; + +pub struct Object(HashMap); +pub struct Array(Vec); + +pub enum Json { + Bool(bool), + Object(Object), + Array(Array), + Number(f64), + String(String), + Null +} + +pub enum JsonError<'a> { + InvalidTokenErr(&'a str), + ExpectedValueErr(&'a str), + ObjectExpectedValueErr(&'a str), + ObjectInvalidKeyErr(&'a str), + MaxDepthErr(&'a str), + InvalidNumberErr(&'a str), + InvalidStringErr(&'a str), + StringInvalidEscapeErr(&'a str), + StringInvalidUnicodeErr(&'a str), + StringInvalidErr(&'a str), +} + +fn skip_ws(raw_json: &str) -> &str { + let non_ws = raw_json.find(|chr: char| !chr.is_whitespace()).unwrap_or(raw_json.len()); + &raw_json[non_ws..] +} + +impl Json { + pub fn parse(raw_json: &str) -> Result { + todo!() + } + + fn parse_value(raw: &str) -> Result<(&str, Json), JsonError> { + let raw = skip_ws(raw); + match raw.chars().next() { + Some('"') => Json::parse_string(raw), + Some('{') => Json::parse_object(raw), + Some('[') => Json::parse_array(raw), + Some(_) => Json::parse_literal(raw), + None => return Err(JsonError::StringInvalidErr(raw)) + } + } + + fn parse_object(raw: &str) -> Result<(&str, Json), JsonError> { + let mut empty = true; + let raw = skip_ws(raw); + + 'outer: loop { + for chr in raw.chars() { + } + } + + todo!() + } + fn parse_array(raw: &str) -> Result<(&str, Json), JsonError> { + todo!() + } + fn parse_string(raw: &str) -> Result<(&str, Json), JsonError> { + todo!() + } + fn parse_literal(raw: &str) -> Result<(&str, Json), JsonError> { + todo!() + } +} -- cgit v1.2.3