use crate::datatypes::values::Value;
pub fn json_value_to_kglite_value(v: &serde_json::Value) -> Value {
match v {
serde_json::Value::Null => Value::Null,
serde_json::Value::Bool(b) => Value::Boolean(*b),
serde_json::Value::Number(n) => {
if let Some(i) = n.as_i64() {
Value::Int64(i)
} else if let Some(f) = n.as_f64() {
Value::Float64(f)
} else {
Value::Null
}
}
serde_json::Value::String(s) => Value::String(s.clone()),
other => Value::String(other.to_string()),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn null_roundtrip() {
assert_eq!(
json_value_to_kglite_value(&serde_json::json!(null)),
Value::Null
);
}
#[test]
fn bool_roundtrip() {
assert_eq!(
json_value_to_kglite_value(&serde_json::json!(true)),
Value::Boolean(true)
);
assert_eq!(
json_value_to_kglite_value(&serde_json::json!(false)),
Value::Boolean(false)
);
}
#[test]
fn integer_number() {
assert_eq!(
json_value_to_kglite_value(&serde_json::json!(42)),
Value::Int64(42)
);
assert_eq!(
json_value_to_kglite_value(&serde_json::json!(-7)),
Value::Int64(-7)
);
}
#[test]
fn float_number() {
match json_value_to_kglite_value(&serde_json::json!(3.14)) {
Value::Float64(f) => assert!((f - 3.14).abs() < 1e-9),
other => panic!("expected Float64, got {other:?}"),
}
}
#[test]
fn string_roundtrip() {
assert_eq!(
json_value_to_kglite_value(&serde_json::json!("hello")),
Value::String("hello".to_string())
);
}
#[test]
fn array_serialises_to_string() {
let v = serde_json::json!([1, "two", null, true]);
let out = json_value_to_kglite_value(&v);
match out {
Value::String(s) => assert_eq!(s, r#"[1,"two",null,true]"#),
other => panic!("expected String, got {other:?}"),
}
}
#[test]
fn object_serialises_to_string() {
let v = serde_json::json!({"a": 1, "b": "x"});
match json_value_to_kglite_value(&v) {
Value::String(s) => {
assert!(s == r#"{"a":1,"b":"x"}"# || s == r#"{"b":"x","a":1}"#);
}
other => panic!("expected String, got {other:?}"),
}
}
}