use serde_json::Value;
pub fn valid(value: &Value) -> Result<bool, Option<String>> {
match value {
Value::Null => Ok(true),
Value::String(_) => Ok(true),
Value::Bool(_) => Ok(true),
Value::Number(n) => {
if let Some(f) = n.as_f64() {
if f.is_finite() && !f.is_nan() {
Ok(true)
} else {
Ok(false) }
} else {
Ok(true) }
}
Value::Object(obj) => {
if obj.len() == 1 {
if let Some(soul_val) = obj.get("#") {
if let Some(soul) = soul_val.as_str() {
return Err(Some(soul.to_string()));
}
}
}
Ok(false)
}
Value::Array(_) => {
Ok(false)
}
}
}
pub fn valid_soul(value: &Value) -> Option<String> {
match valid(value) {
Err(Some(soul)) => Some(soul), Ok(true) => {
if let Value::String(s) = value {
if !s.is_empty() {
Some(s.clone())
} else {
None
}
} else {
None
}
}
_ => None,
}
}
pub fn is_valid_data(value: &Value) -> bool {
match valid(value) {
Ok(true) => true,
Err(Some(_)) => true, _ => false,
}
}