1use serde_json::Value;
3use std::fmt;
4
5#[derive(Copy, Clone, Eq, PartialEq)]
7pub enum Type {
8 Null,
10 Bool,
12 Number,
14 String,
16 Object,
18 Array,
20}
21
22impl fmt::Display for Type {
23 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
24 write!(f, "{}", {
25 match *self {
26 Self::Null => "null",
27 Self::Bool => "boolean",
28 Self::Number => "number",
29 Self::String => "string",
30 Self::Object => "object",
31 Self::Array => "array",
32 }
33 })
34 }
35}
36
37impl From<&Value> for Type {
38 fn from(value: &Value) -> Self {
39 match value {
40 Value::Null => Self::Null,
41 Value::Bool(_) => Self::Bool,
42 Value::Number(_) => Self::Number,
43 Value::String(_) => Self::String,
44 Value::Object(_) => Self::Object,
45 Value::Array(_) => Self::Array,
46 }
47 }
48}
49
50pub fn assert(value: &Value, kinds: &[Type]) -> (bool, Option<String>) {
57 for kind in kinds {
58 if !assert_type(value, kind) {
59 return (false, Some(kind.to_string()));
60 }
61 }
62 (true, None)
63}
64
65fn assert_type(value: &Value, kind: &Type) -> bool {
66 match value {
67 Value::Null => kind == &Type::Null,
68 Value::Bool(_) => kind == &Type::Bool,
69 Value::String(_) => kind == &Type::String,
70 Value::Number(_) => kind == &Type::Number,
71 Value::Object(_) => kind == &Type::Object,
72 Value::Array(_) => kind == &Type::Array,
73 }
74}