Skip to main content

toon_validate_core/
json_parser.rs

1use crate::{error::Result, value::Value};
2use serde_json;
3
4pub struct JsonParser;
5
6impl JsonParser {
7    pub fn parse(input: &str) -> Result<Value> {
8        let json_value: serde_json::Value = serde_json::from_str(input)?;
9        Ok(Self::convert_json_to_value(json_value))
10    }
11    
12    fn convert_json_to_value(json: serde_json::Value) -> Value {
13        match json {
14            serde_json::Value::Null => Value::Null,
15            serde_json::Value::Bool(b) => Value::Bool(b),
16            serde_json::Value::Number(n) => {
17                Value::Number(n.as_f64().unwrap_or(0.0))
18            }
19            serde_json::Value::String(s) => Value::String(s),
20            serde_json::Value::Array(arr) => {
21                Value::Array(arr.into_iter().map(Self::convert_json_to_value).collect())
22            }
23            serde_json::Value::Object(obj) => {
24                Value::Object(
25                    obj.into_iter()
26                        .map(|(k, v)| (k, Self::convert_json_to_value(v)))
27                        .collect()
28                )
29            }
30        }
31    }
32}