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