toon_format/encode/
primitives.rs1pub fn is_primitive(value: &serde_json::Value) -> bool {
2 matches!(
3 value,
4 serde_json::Value::Null
5 | serde_json::Value::Bool(_)
6 | serde_json::Value::Number(_)
7 | serde_json::Value::String(_)
8 )
9}
10
11pub fn all_primitives(values: &[serde_json::Value]) -> bool {
12 values.iter().all(is_primitive)
13}
14
15pub fn normalize_value(value: serde_json::Value) -> serde_json::Value {
16 match value {
17 serde_json::Value::Null => serde_json::Value::Null,
18 serde_json::Value::Bool(b) => serde_json::Value::Bool(b),
19 serde_json::Value::Number(n) => serde_json::Value::Number(n),
20 serde_json::Value::String(s) => serde_json::Value::String(s),
21 serde_json::Value::Array(arr) => {
22 serde_json::Value::Array(arr.into_iter().map(normalize_value).collect())
23 }
24 serde_json::Value::Object(obj) => serde_json::Value::Object(
25 obj.into_iter()
26 .map(|(k, v)| (k, normalize_value(v)))
27 .collect(),
28 ),
29 }
30}
31
32#[cfg(test)]
33mod tests {
34 use serde_json::json;
35
36 use super::*;
37
38 #[test]
39 fn test_is_primitive() {
40 assert!(is_primitive(&json!(null)));
41 assert!(is_primitive(&json!(true)));
42 assert!(is_primitive(&json!(42)));
43 assert!(is_primitive(&json!("hello")));
44 assert!(!is_primitive(&json!([])));
45 assert!(!is_primitive(&json!({})));
46 }
47
48 #[test]
49 fn test_all_primitives() {
50 assert!(all_primitives(&[json!(1), json!(2), json!(3)]));
51 assert!(all_primitives(&[json!("a"), json!("b")]));
52 assert!(all_primitives(&[json!(null), json!(true), json!(42)]));
53 assert!(!all_primitives(&[json!(1), json!([]), json!(3)]));
54 assert!(!all_primitives(&[json!({})]));
55 }
56
57 #[test]
58 fn test_normalize_value() {
59 assert_eq!(normalize_value(json!(null)), json!(null));
60 assert_eq!(normalize_value(json!(42)), json!(42));
61 assert_eq!(normalize_value(json!("hello")), json!("hello"));
62
63 let normalized = normalize_value(json!({"a": 1, "b": [2, 3]}));
64 assert_eq!(normalized, json!({"a": 1, "b": [2, 3]}));
65 }
66}