partiql/value/
json_value.rs1use std::collections::{BTreeMap, BTreeSet};
2
3use indexmap::IndexMap as Map;
4use ordered_float::OrderedFloat;
5use serde_derive::{Deserialize, Serialize};
6
7use crate::value::PqlValue;
8
9#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)]
10#[serde(untagged)]
11pub enum BJsonValue {
12 Null,
13 Str(String),
14 Boolean(bool),
15 Num(OrderedFloat<f64>),
16 Array(BTreeSet<BJsonValue>),
17 Object(BTreeMap<String, BJsonValue>),
18}
19
20#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
21#[serde(untagged)]
22pub enum JsonValue {
23 Null,
24 Str(String),
25 Boolean(bool),
26 Num(OrderedFloat<f64>),
27 Array(Vec<JsonValue>),
28 Object(Map<String, JsonValue>),
29}
30
31impl From<JsonValue> for PqlValue {
32 fn from(json: JsonValue) -> Self {
33 match json {
34 JsonValue::Null => Self::Null,
35 JsonValue::Str(string) => Self::Str(string),
36 JsonValue::Boolean(boolean) => Self::Boolean(boolean),
37 JsonValue::Num(number) => Self::Float(number),
38 JsonValue::Array(array) => Self::Array(
39 array
40 .into_iter()
41 .filter_map(|v| match v {
42 JsonValue::Null => None,
43 _ => Some(Self::from(v)),
44 })
45 .collect::<Vec<_>>(),
46 ),
47 JsonValue::Object(map) => Self::Object(
48 map.into_iter()
49 .filter_map(|(k, v)| match v {
50 JsonValue::Null => None,
51 _ => Some((k, Self::from(v))),
52 })
53 .collect::<Map<_, _>>(),
54 ),
55 }
56 }
57}
58
59impl From<PqlValue> for JsonValue {
60 fn from(pqlv: PqlValue) -> Self {
61 match pqlv {
62 PqlValue::Null => Self::Null,
63 PqlValue::Str(string) => Self::Str(string),
64 PqlValue::Boolean(boolean) => Self::Boolean(boolean),
65 PqlValue::Float(float) => Self::Num(float),
66 PqlValue::Int(int) => Self::Num(OrderedFloat(int as f64)),
67 PqlValue::DateTime(datetime) => Self::Str(datetime.to_rfc3339()),
68 PqlValue::Array(array) => {
69 Self::Array(array.into_iter().map(|v| Self::from(v)).collect::<Vec<_>>())
70 }
71 PqlValue::Object(map) => Self::Object(
72 map.into_iter()
73 .map(|(k, v)| (k, Self::from(v)))
74 .collect::<Map<_, _>>(),
75 ),
76 }
77 }
78}
79
80pub fn to_pqlvalue(json: serde_json::value::Value) -> PqlValue {
81 match json {
82 serde_json::value::Value::Null => PqlValue::Null,
83 serde_json::value::Value::String(string) => PqlValue::Str(string),
84 serde_json::value::Value::Bool(boolean) => PqlValue::Boolean(boolean),
85 serde_json::value::Value::Number(number) if number.is_f64() => {
86 PqlValue::Float(OrderedFloat(number.as_f64().unwrap()))
87 }
88 serde_json::value::Value::Number(number) => PqlValue::Int(number.as_i64().unwrap()),
89 serde_json::value::Value::Array(array) => {
90 PqlValue::Array(array.into_iter().map(to_pqlvalue).collect::<Vec<_>>())
91 }
92 serde_json::value::Value::Object(map) => PqlValue::Object(
93 map.into_iter()
94 .map(|(k, v)| (k, to_pqlvalue(v)))
95 .collect::<Map<_, _>>(),
96 ),
97 }
98}