1pub type Value = serde_json::Value;
3
4pub type Headers = std::collections::HashMap<String, Value>;
6
7pub fn cmp_values(a: &Value, b: &Value) -> std::cmp::Ordering {
15 use serde_json::Value as J;
16 match (a, b) {
17 (J::Null, J::Null) => std::cmp::Ordering::Equal,
18 (J::Null, _) => std::cmp::Ordering::Less,
19 (_, J::Null) => std::cmp::Ordering::Greater,
20 (J::Bool(va), J::Bool(vb)) => va.cmp(vb),
21 (J::Bool(_), _) => std::cmp::Ordering::Less,
22 (_, J::Bool(_)) => std::cmp::Ordering::Greater,
23 (J::Number(va), J::Number(vb)) => {
24 let af = va.as_f64().unwrap_or(f64::NAN);
25 let bf = vb.as_f64().unwrap_or(f64::NAN);
26 af.partial_cmp(&bf)
28 .unwrap_or_else(|| af.is_nan().cmp(&bf.is_nan()))
29 }
30 (J::Number(_), _) => std::cmp::Ordering::Less,
31 (_, J::Number(_)) => std::cmp::Ordering::Greater,
32 (J::String(sa), J::String(sb)) => sa.cmp(sb),
33 (J::Array(va), J::Array(vb)) => serde_json::to_string(va)
34 .unwrap_or_default()
35 .cmp(&serde_json::to_string(vb).unwrap_or_default()),
36 (J::Object(va), J::Object(vb)) => serde_json::to_string(va)
37 .unwrap_or_default()
38 .cmp(&serde_json::to_string(vb).unwrap_or_default()),
39 (J::Array(_), _) => std::cmp::Ordering::Less,
40 (_, J::Array(_)) => std::cmp::Ordering::Greater,
41 (J::Object(_), _) => std::cmp::Ordering::Less,
42 (_, J::Object(_)) => std::cmp::Ordering::Greater,
43 }
44}