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}