Helper function to hash Values (since Value doesn't implement Hash)
(value: &Value, state: &mut H)
| 175 | |
| 176 | // Helper function to hash Values (since Value doesn't implement Hash) |
| 177 | fn hash_value<H: Hasher>(value: &Value, state: &mut H) { |
| 178 | match value { |
| 179 | Value::String(s) => { |
| 180 | 0u8.hash(state); |
| 181 | s.hash(state); |
| 182 | } |
| 183 | Value::Number(n) => { |
| 184 | 1u8.hash(state); |
| 185 | n.to_bits().hash(state); |
| 186 | } |
| 187 | Value::Boolean(b) => { |
| 188 | 2u8.hash(state); |
| 189 | b.hash(state); |
| 190 | } |
| 191 | Value::Null => { |
| 192 | 3u8.hash(state); |
| 193 | } |
| 194 | Value::DateTime(dt) => { |
| 195 | 4u8.hash(state); |
| 196 | dt.timestamp().hash(state); |
| 197 | dt.timestamp_subsec_nanos().hash(state); |
| 198 | } |
| 199 | Value::DateTimeWithFixedOffset(dt) => { |
| 200 | 5u8.hash(state); |
| 201 | dt.timestamp().hash(state); |
| 202 | dt.timestamp_subsec_nanos().hash(state); |
| 203 | dt.offset().local_minus_utc().hash(state); |
| 204 | } |
| 205 | Value::DateTimeWithNamedTz(tz, dt) => { |
| 206 | 6u8.hash(state); |
| 207 | tz.hash(state); |
| 208 | dt.timestamp().hash(state); |
| 209 | dt.timestamp_subsec_nanos().hash(state); |
| 210 | } |
| 211 | Value::TimeWindow(tw) => { |
| 212 | 7u8.hash(state); |
| 213 | tw.hash(state); |
| 214 | } |
| 215 | Value::Array(arr) => { |
| 216 | 8u8.hash(state); |
| 217 | arr.len().hash(state); |
| 218 | for item in arr { |
| 219 | hash_value(item, state); |
| 220 | } |
| 221 | } |
| 222 | Value::Vector(vec) => { |
| 223 | 9u8.hash(state); |
| 224 | vec.len().hash(state); |
| 225 | for &val in vec { |
| 226 | val.to_bits().hash(state); |
| 227 | } |
| 228 | } |
| 229 | Value::Path(path) => { |
| 230 | 10u8.hash(state); |
| 231 | // PathValue doesn't implement Hash, so hash its string representation |
| 232 | format!("{:?}", path).hash(state); |
| 233 | } |
| 234 | Value::List(list) => { |