1use crate::{JsonArray, JsonObject, JsonPrimitive, JsonValue, StringOrNumberOrBoolOrNull};
2
3pub fn normalize_json_value(value: JsonValue) -> JsonValue {
4 match value {
5 JsonValue::Primitive(primitive) => JsonValue::Primitive(normalize_primitive(primitive)),
6 JsonValue::Array(items) => {
7 JsonValue::Array(items.into_iter().map(normalize_json_value).collect())
8 }
9 JsonValue::Object(entries) => JsonValue::Object(
10 entries
11 .into_iter()
12 .map(|(key, value)| (key, normalize_json_value(value)))
13 .collect(),
14 ),
15 }
16}
17
18#[must_use]
19pub fn normalize_primitive(value: JsonPrimitive) -> JsonPrimitive {
20 match value {
21 StringOrNumberOrBoolOrNull::Number(value) => {
22 if !value.is_finite() {
23 StringOrNumberOrBoolOrNull::Null
24 } else if value == 0.0 {
25 StringOrNumberOrBoolOrNull::Number(0.0)
26 } else {
27 StringOrNumberOrBoolOrNull::Number(value)
28 }
29 }
30 _ => value,
31 }
32}
33
34#[must_use]
35pub const fn is_json_primitive(value: &JsonValue) -> bool {
36 matches!(value, JsonValue::Primitive(_))
37}
38
39#[must_use]
40pub const fn is_json_array(value: &JsonValue) -> bool {
41 matches!(value, JsonValue::Array(_))
42}
43
44#[must_use]
45pub const fn is_json_object(value: &JsonValue) -> bool {
46 matches!(value, JsonValue::Object(_))
47}
48
49#[must_use]
50pub const fn is_empty_object(value: &JsonObject) -> bool {
51 value.is_empty()
52}
53
54#[must_use]
55pub fn is_array_of_primitives(value: &JsonArray) -> bool {
56 value
57 .iter()
58 .all(|item| matches!(item, JsonValue::Primitive(_)))
59}
60
61#[must_use]
62pub fn is_array_of_arrays(value: &JsonArray) -> bool {
63 value.iter().all(|item| matches!(item, JsonValue::Array(_)))
64}
65
66#[must_use]
67pub fn is_array_of_objects(value: &JsonArray) -> bool {
68 value
69 .iter()
70 .all(|item| matches!(item, JsonValue::Object(_)))
71}