use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum JsonPrimitive {
Null,
Bool,
Int,
Float,
String,
Object,
Array,
}
impl JsonPrimitive {
pub fn of_value(v: &Value) -> JsonPrimitive {
match v {
Value::Null => JsonPrimitive::Null,
Value::Bool(_) => JsonPrimitive::Bool,
Value::Number(n) => {
if n.is_i64() || n.is_u64() {
JsonPrimitive::Int
} else {
JsonPrimitive::Float
}
}
Value::String(_) => JsonPrimitive::String,
Value::Array(_) => JsonPrimitive::Array,
Value::Object(_) => JsonPrimitive::Object,
}
}
pub fn promote(a: JsonPrimitive, b: JsonPrimitive) -> JsonPrimitive {
use JsonPrimitive::*;
if a == b {
return a;
}
match (a, b) {
(Int, Float) | (Float, Int) => Float,
(x, y) => {
if x == Null { y } else { x }
}
}
}
}