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}