summaryrefslogtreecommitdiff
path: root/src/json.rs
diff options
context:
space:
mode:
authorAnna (navi) Figueiredo Gomes <navi@vlhl.dev>2023-10-14 10:28:30 +0100
committerAnna (navi) Figueiredo Gomes <navi@vlhl.dev>2023-10-14 10:28:30 +0100
commitfa65142861d256e1c12c225e22ac2e13914b7fbb (patch)
tree1ca29c523c039cb13c46850bcac17777c0ab0766 /src/json.rs
Diffstat (limited to 'src/json.rs')
-rw-r--r--src/json.rs70
1 files changed, 70 insertions, 0 deletions
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<String, Json>);
+pub struct Array(Vec<Json>);
+
+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<Json, JsonError> {
+ 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!()
+ }
+}