use std::{fmt, str::FromStr};
use serde_json::Value;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum JsonTopLevelKind {
Object,
Array,
Other,
}
impl JsonTopLevelKind {
#[inline]
#[must_use]
pub fn of(value: &Value) -> Self {
match value {
Value::Object(_) => Self::Object,
Value::Array(_) => Self::Array,
_ => Self::Other,
}
}
}
impl From<&Value> for JsonTopLevelKind {
#[inline]
fn from(value: &Value) -> Self {
Self::of(value)
}
}
impl fmt::Display for JsonTopLevelKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let name = match self {
Self::Object => "object",
Self::Array => "array",
Self::Other => "other",
};
f.write_str(name)
}
}
impl FromStr for JsonTopLevelKind {
type Err = &'static str;
fn from_str(value: &str) -> Result<Self, Self::Err> {
if value.eq_ignore_ascii_case("object") {
Ok(Self::Object)
} else if value.eq_ignore_ascii_case("array") {
Ok(Self::Array)
} else if value.eq_ignore_ascii_case("other") {
Ok(Self::Other)
} else {
Err("unknown JsonTopLevelKind")
}
}
}