Skip to main content

camel_api/
value.rs

1/// Value type alias for dynamic header/property values.
2pub type Value = serde_json::Value;
3
4/// Headers type alias.
5pub type Headers = std::collections::HashMap<String, Value>;
6
7/// Total order over two `serde_json::Value`s.
8///
9/// Tier: Null < Bool < Number < String < Array < Object.
10/// NaN sorts AFTER all real numbers (NaN-last), consistent with
11/// `camel_processor::sort::SortKey`.
12///
13/// Shared by batch/stream resequencing policies (I3).
14pub 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            // NaN-last: NaN > all real numbers; NaN == NaN
27            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}