Skip to main content

partiql/value/
json_value.rs

1use 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}