json_ld_core/utils/
comparison.rs
1use json_syntax::Value;
2
3pub fn simple_json_ld_eq(a: &Value, b: &Value) -> bool {
4 match (a, b) {
5 (Value::Array(a), Value::Array(b)) if a.len() == b.len() => {
6 let mut selected = Vec::with_capacity(a.len());
7 selected.resize(a.len(), false);
8
9 'a_items: for item in a.iter() {
10 for (i, sel) in selected.iter_mut().enumerate() {
11 if !*sel && simple_json_ld_eq(item, b.get(i).unwrap()) {
12 *sel = true;
13 continue 'a_items;
14 }
15 }
16
17 return false;
18 }
19
20 true
21 }
22 (Value::Object(a), Value::Object(b)) if a.len() == b.len() => {
23 for entry in a.iter() {
24 let key = &entry.key;
25 let value_a = &entry.value;
26 if let Some(value_b) = b.get(key).next() {
27 if key == "@list" {
28 match (value_a, value_b) {
29 (Value::Array(item_a), Value::Array(item_b))
30 if item_a.len() == item_b.len() =>
31 {
32 if !item_a
33 .iter()
34 .zip(item_b)
35 .all(|(a, b)| simple_json_ld_eq(a, b))
36 {
37 return false;
38 }
39 }
40 _ => {
41 if !simple_json_ld_eq(value_a, value_b) {
42 return false;
43 }
44 }
45 }
46 } else if !simple_json_ld_eq(value_a, value_b) {
47 return false;
48 }
49 } else {
50 return false;
51 }
52 }
53
54 true
55 }
56 (Value::Null, Value::Null) => true,
57 (Value::Boolean(a), Value::Boolean(b)) => a == b,
58 (Value::Number(a), Value::Number(b)) => a == b,
59 (Value::String(a), Value::String(b)) => (**a) == (**b),
60 _ => false,
61 }
62}