mini_json/
json.rs

1use std::{collections::HashMap, fmt, fs};
2
3use crate::parser::Parser;
4
5#[derive(Debug)]
6pub enum JsonValue {
7    String(String),
8    Integer(isize),
9    Float(f64),
10    Boolean(bool),
11    Object(HashMap<String, JsonValue>),
12    Array(Vec<JsonValue>),
13}
14
15#[derive(Debug)]
16pub enum Json {
17    Object(HashMap<String, JsonValue>),
18    Array(Vec<JsonValue>),
19}
20
21pub fn parse_from_file(file_path: &str) -> std::io::Result<Json> {
22    let source = fs::read_to_string(file_path)?;
23    return Ok(parse_from_string(source));
24}
25
26pub fn parse_from_string(source: String) -> Json {
27    let mut parser = Parser::new(source);
28    return parser.parse();
29}
30
31fn print_value(depth: i32, json_value: &JsonValue, f: &mut fmt::Formatter) -> fmt::Result {
32    match json_value {
33        JsonValue::Boolean(val) => {
34            write!(f, "{val}")?;
35        }
36        JsonValue::Float(val) => {
37            write!(f, "{val}")?;
38        }
39        JsonValue::Integer(val) => {
40            write!(f, "{val}")?;
41        }
42        JsonValue::String(val) => {
43            write!(f, "\"{val}\"")?;
44        }
45        JsonValue::Array(array) => {
46            writeln!(f, "[")?;
47
48            for val in array {
49                for _ in 0..depth {
50                    write!(f, "  ")?;
51                }
52
53                print_value(depth + 1, val, f)?;
54
55                writeln!(f, ",")?;
56            }
57
58            for _ in 0..depth - 1 {
59                write!(f, "  ")?;
60            }
61            write!(f, "]")?;
62        }
63        JsonValue::Object(object) => {
64            writeln!(f, "{{")?;
65
66            for (key, val) in object {
67                for _ in 0..depth {
68                    write!(f, "  ")?;
69                }
70                write!(f, "\"{key}\": ")?;
71
72                print_value(depth + 1, val, f)?;
73
74                writeln!(f, ",")?;
75            }
76
77            for _ in 0..depth - 1 {
78                write!(f, "  ")?;
79            }
80            write!(f, "}}")?;
81        }
82    }
83
84    return Ok(());
85}
86
87impl fmt::Display for Json {
88    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
89        match &self {
90            Json::Object(object) => {
91                writeln!(f, "{{")?;
92
93                for (key, val) in object {
94                    write!(f, "  \"{key}\": ")?;
95                    print_value(2, val, f)?;
96                    writeln!(f, ",")?;
97                }
98
99                writeln!(f, "}}")?;
100            }
101            Json::Array(array) => {
102                writeln!(f, "[")?;
103
104                for val in array {
105                    write!(f, "  ")?;
106                    print_value(2, val, f)?;
107                    writeln!(f, ",")?;
108                }
109
110                writeln!(f, "]")?;
111            }
112        }
113
114        return Ok(());
115    }
116}