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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
use std::collections::{BTreeMap, BTreeSet}; use indexmap::IndexMap as Map; use ordered_float::OrderedFloat; use serde_derive::{Deserialize, Serialize}; use crate::value::PqlValue; #[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)] #[serde(untagged)] pub enum BJsonValue { Null, Str(String), Boolean(bool), Num(OrderedFloat<f64>), Array(BTreeSet<BJsonValue>), Object(BTreeMap<String, BJsonValue>), } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(untagged)] pub enum JsonValue { Null, Str(String), Boolean(bool), Num(OrderedFloat<f64>), Array(Vec<JsonValue>), Object(Map<String, JsonValue>), } impl From<JsonValue> for PqlValue { fn from(json: JsonValue) -> Self { match json { JsonValue::Null => Self::Null, JsonValue::Str(string) => Self::Str(string), JsonValue::Boolean(boolean) => Self::Boolean(boolean), JsonValue::Num(number) => Self::Float(number), JsonValue::Array(array) => Self::Array( array .into_iter() .filter_map(|v| match v { JsonValue::Null => None, _ => Some(Self::from(v)), }) .collect::<Vec<_>>(), ), JsonValue::Object(map) => Self::Object( map.into_iter() .filter_map(|(k, v)| match v { JsonValue::Null => None, _ => Some((k, Self::from(v))), }) .collect::<Map<_, _>>(), ), } } } impl From<PqlValue> for JsonValue { fn from(pqlv: PqlValue) -> Self { match pqlv { PqlValue::Missing => unreachable!(), PqlValue::Null => Self::Null, PqlValue::Str(string) => Self::Str(string), PqlValue::Boolean(boolean) => Self::Boolean(boolean), PqlValue::Float(float) => Self::Num(float), PqlValue::Int(int) => Self::Num(OrderedFloat(int as f64)), PqlValue::DateTime(datetime) => Self::Str(datetime.to_rfc3339()), PqlValue::Array(array) => { Self::Array(array.into_iter().map(Self::from).collect::<Vec<_>>()) } PqlValue::Object(map) => Self::Object( map.into_iter() .map(|(k, v)| (k, Self::from(v))) .collect::<Map<_, _>>(), ), } } } pub fn to_pqlvalue(json: serde_json::value::Value) -> PqlValue { match json { serde_json::value::Value::Null => PqlValue::Null, serde_json::value::Value::String(string) => PqlValue::Str(string), serde_json::value::Value::Bool(boolean) => PqlValue::Boolean(boolean), serde_json::value::Value::Number(number) if number.is_f64() => { PqlValue::Float(OrderedFloat(number.as_f64().unwrap())) } serde_json::value::Value::Number(number) => PqlValue::Int(number.as_i64().unwrap()), serde_json::value::Value::Array(array) => { PqlValue::Array(array.into_iter().map(to_pqlvalue).collect::<Vec<_>>()) } serde_json::value::Value::Object(map) => PqlValue::Object( map.into_iter() .map(|(k, v)| (k, to_pqlvalue(v))) .collect::<Map<_, _>>(), ), } }