1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
use crate::data::{ast::Interval, Literal}; use crate::error_format::*; use std::collections::HashMap; use crate::data::primitive::{ array::PrimitiveArray, boolean::PrimitiveBoolean, float::PrimitiveFloat, int::PrimitiveInt, null::PrimitiveNull, object::PrimitiveObject, string::PrimitiveString, }; pub fn json_to_literal( literal: &serde_json::Value, interval: Interval, ) -> Result<Literal, ErrorInfo> { match literal { serde_json::Value::String(val) => Ok(PrimitiveString::get_literal(val, interval)), serde_json::Value::Bool(val) => Ok(PrimitiveBoolean::get_literal(*val, interval)), serde_json::Value::Null => Ok(PrimitiveNull::get_literal(interval)), serde_json::Value::Number(val) => { if let (true, Some(float)) = (val.is_f64(), val.as_f64()) { Ok(PrimitiveFloat::get_literal(float, interval)) } else if let (true, Some(int)) = (val.is_i64(), val.as_i64()) { Ok(PrimitiveInt::get_literal(int, interval)) } else { Err(gen_error_info(interval, ERROR_JSON_TO_LITERAL.to_owned())) } } serde_json::Value::Array(val) => { let mut vec = vec![]; for elem in val { vec.push(json_to_literal(elem, interval)?); } Ok(PrimitiveArray::get_literal(&vec, interval)) } serde_json::Value::Object(val) => { let mut map = HashMap::new(); for (k, v) in val.iter() { map.insert(k.to_owned(), json_to_literal(v, interval)?); } Ok(PrimitiveObject::get_literal(&map, interval)) } } }