Helper function to compare Values (since Value doesn't implement Eq)
(a: &Value, b: &Value)
| 153 | |
| 154 | // Helper function to compare Values (since Value doesn't implement Eq) |
| 155 | fn values_equal(a: &Value, b: &Value) -> bool { |
| 156 | match (a, b) { |
| 157 | (Value::String(a), Value::String(b)) => a == b, |
| 158 | (Value::Number(a), Value::Number(b)) => (a - b).abs() < f64::EPSILON, |
| 159 | (Value::Boolean(a), Value::Boolean(b)) => a == b, |
| 160 | (Value::Null, Value::Null) => true, |
| 161 | (Value::DateTime(a), Value::DateTime(b)) => a == b, |
| 162 | (Value::DateTimeWithFixedOffset(a), Value::DateTimeWithFixedOffset(b)) => a == b, |
| 163 | (Value::DateTimeWithNamedTz(tz_a, dt_a), Value::DateTimeWithNamedTz(tz_b, dt_b)) => { |
| 164 | tz_a == tz_b && dt_a == dt_b |
| 165 | } |
| 166 | (Value::TimeWindow(a), Value::TimeWindow(b)) => a == b, |
| 167 | (Value::Array(a), Value::Array(b)) => { |
| 168 | a.len() == b.len() && a.iter().zip(b).all(|(x, y)| values_equal(x, y)) |
| 169 | } |
| 170 | (Value::Vector(a), Value::Vector(b)) => a == b, |
| 171 | (Value::Path(a), Value::Path(b)) => a == b, |
| 172 | _ => false, |
| 173 | } |
| 174 | } |
| 175 | |
| 176 | // Helper function to hash Values (since Value doesn't implement Hash) |
| 177 | fn hash_value<H: Hasher>(value: &Value, state: &mut H) { |