Skip to main content

toon/encode/
normalize.rs

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