1use crate::float::{FloatPolicy, FloatRepr, RejectFloatPolicy};
3use serde::{de, ser};
4use std::fmt;
5use std::hash::Hash;
6use std::marker;
7use std::mem;
8
9#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
11pub enum Integer {
12 I8(i8),
14 I16(i16),
16 I32(i32),
18 I64(i64),
20 I128(i128),
22 U8(u8),
24 U16(u16),
26 U32(u32),
28 U64(u64),
30 U128(u128),
32}
33
34#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
36pub enum Float<F>
37where
38 F: FloatPolicy,
39{
40 F32(F::F32),
42 F64(F::F64),
44}
45
46#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
84pub enum Key<F = RejectFloatPolicy>
85where
86 F: FloatPolicy,
87{
88 Unit,
90 Bool(bool),
92 Integer(Integer),
94 Float(Float<F>),
96 Bytes(Box<[u8]>),
98 String(Box<str>),
100 Seq(Box<[Key<F>]>),
102 Map(Box<[(Key<F>, Key<F>)]>),
104}
105
106impl Default for Key {
107 fn default() -> Self {
108 Self::Unit
109 }
110}
111
112impl<F> Key<F>
113where F: FloatPolicy + Ord
114{
115 pub fn normalize(self) -> Self {
117 match self {
118 Key::<F>::Seq(mut vec) => {
119 for value in vec.iter_mut() {
120 *value = mem::replace(value, Key::<F>::Unit).normalize();
121 }
122
123 Key::<F>::Seq(vec)
124 }
125 Key::<F>::Map(mut map) => {
126 for (key, value) in map.iter_mut() {
127 *key = mem::replace(key, Key::<F>::Unit).normalize();
128 *value = mem::replace(value, Key::<F>::Unit).normalize();
129 }
130
131 map.sort_by(|a, b| a.0.cmp(&b.0));
132 Key::<F>::Map(map)
133 }
134 other => other,
135 }
136 }
137}
138
139macro_rules! impl_integer_from {
140 ($variant:ident, $for_type:ty) => {
141 impl<F> From<$for_type> for Key<F>
142 where
143 F: FloatPolicy,
144 {
145 fn from(v: $for_type) -> Key<F> {
146 Key::Integer(Integer::$variant(v))
147 }
148 }
149 };
150}
151
152macro_rules! impl_from {
153 ($variant:path, $for_type:ty) => {
154 impl<F> From<$for_type> for Key<F>
155 where
156 F: FloatPolicy,
157 {
158 fn from(v: $for_type) -> Key<F> {
159 $variant(v.into())
160 }
161 }
162 };
163}
164
165impl_integer_from!(I8, i8);
166impl_integer_from!(I16, i16);
167impl_integer_from!(I32, i32);
168impl_integer_from!(I64, i64);
169impl_integer_from!(I128, i128);
170impl_integer_from!(U8, u8);
171impl_integer_from!(U16, u16);
172impl_integer_from!(U32, u32);
173impl_integer_from!(U64, u64);
174impl_integer_from!(U128, u128);
175
176impl_from!(Key::Bool, bool);
177impl_from!(Key::Bytes, Vec<u8>);
178impl_from!(Key::String, String);
179impl_from!(Key::Seq, Vec<Key<F>>);
180impl_from!(Key::Map, Vec<(Key<F>, Key<F>)>);
181
182impl<F> ser::Serialize for Key<F>
205where
206 F: FloatPolicy,
207{
208 #[inline]
209 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
210 where
211 S: ser::Serializer,
212 {
213 match self {
214 Key::Unit => serializer.serialize_unit(),
215 Key::Integer(Integer::U8(v)) => serializer.serialize_u8(*v),
216 Key::Integer(Integer::U16(v)) => serializer.serialize_u16(*v),
217 Key::Integer(Integer::U32(v)) => serializer.serialize_u32(*v),
218 Key::Integer(Integer::U64(v)) => serializer.serialize_u64(*v),
219 Key::Integer(Integer::U128(v)) => serializer.serialize_u128(*v),
220 Key::Integer(Integer::I8(v)) => serializer.serialize_i8(*v),
221 Key::Integer(Integer::I16(v)) => serializer.serialize_i16(*v),
222 Key::Integer(Integer::I32(v)) => serializer.serialize_i32(*v),
223 Key::Integer(Integer::I64(v)) => serializer.serialize_i64(*v),
224 Key::Integer(Integer::I128(v)) => serializer.serialize_i128(*v),
225 Key::Float(Float::F32(float)) => float.serialize(serializer),
226 Key::Float(Float::F64(float)) => float.serialize(serializer),
227 Key::Bytes(v) => serializer.serialize_bytes(v),
228 Key::String(v) => serializer.serialize_str(v),
229 Key::Seq(v) => v.serialize(serializer),
230 Key::Map(m) => {
231 use self::ser::SerializeMap as _;
232
233 let mut map = serializer.serialize_map(Some(m.len()))?;
234
235 for (k, v) in m.iter() {
236 map.serialize_key(k)?;
237 map.serialize_value(v)?;
238 }
239
240 map.end()
241 }
242 Key::Bool(v) => serializer.serialize_bool(*v),
243 }
244 }
245}
246
247impl<'de, F> de::Deserialize<'de> for Key<F>
270where
271 F: FloatPolicy,
272{
273 #[inline]
274 fn deserialize<D>(deserializer: D) -> Result<Key<F>, D::Error>
275 where
276 D: de::Deserializer<'de>,
277 {
278 struct ValueVisitor<F>(marker::PhantomData<F>)
279 where
280 F: FloatPolicy;
281
282 impl<'de, F> de::Visitor<'de> for ValueVisitor<F>
283 where
284 F: FloatPolicy,
285 {
286 type Value = Key<F>;
287
288 fn expecting(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
289 fmt.write_str("any valid key")
290 }
291
292 #[inline]
293 fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
294 where
295 E: de::Error,
296 {
297 Ok(Key::String(s.into()))
298 }
299
300 #[inline]
301 fn visit_string<E>(self, s: String) -> Result<Self::Value, E>
302 where
303 E: de::Error,
304 {
305 Ok(Key::String(s.into()))
306 }
307
308 #[inline]
309 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
310 where
311 E: de::Error,
312 {
313 self.visit_byte_buf(v.to_owned())
314 }
315
316 #[inline]
317 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
318 where
319 E: de::Error,
320 {
321 Ok(Key::Bytes(v.into()))
322 }
323
324 #[inline]
325 fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
326 where
327 E: de::Error,
328 {
329 Ok(v.into())
330 }
331
332 #[inline]
333 fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
334 where
335 E: de::Error,
336 {
337 Ok(v.into())
338 }
339
340 #[inline]
341 fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
342 where
343 E: de::Error,
344 {
345 Ok(v.into())
346 }
347
348 #[inline]
349 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
350 where
351 E: de::Error,
352 {
353 Ok(v.into())
354 }
355
356 #[inline]
357 fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
358 where
359 E: de::Error,
360 {
361 Ok(v.into())
362 }
363
364 #[inline]
365 fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
366 where
367 E: de::Error,
368 {
369 Ok(v.into())
370 }
371
372 #[inline]
373 fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
374 where
375 E: de::Error,
376 {
377 Ok(v.into())
378 }
379
380 #[inline]
381 fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
382 where
383 E: de::Error,
384 {
385 Ok(v.into())
386 }
387
388 #[inline]
389 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
390 where
391 E: de::Error,
392 {
393 Ok(v.into())
394 }
395
396 #[inline]
397 fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
398 where
399 E: de::Error,
400 {
401 Ok(v.into())
402 }
403
404 #[inline]
405 fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
406 where
407 E: de::Error,
408 {
409 Ok(Key::Float(Float::F32(
410 <F::F32 as FloatRepr<f32>>::serialize(v).map_err(E::custom)?,
411 )))
412 }
413
414 #[inline]
415 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
416 where
417 E: de::Error,
418 {
419 Ok(Key::Float(Float::F64(
420 <F::F64 as FloatRepr<f64>>::serialize(v).map_err(E::custom)?,
421 )))
422 }
423
424 #[inline]
425 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
426 where
427 E: de::Error,
428 {
429 Ok(Key::Bool(v))
430 }
431
432 #[inline]
433 fn visit_none<E>(self) -> Result<Self::Value, E>
434 where
435 E: de::Error,
436 {
437 self.visit_unit()
438 }
439
440 #[inline]
441 fn visit_unit<E>(self) -> Result<Self::Value, E>
442 where
443 E: de::Error,
444 {
445 Ok(Key::Unit)
446 }
447
448 #[inline]
449 fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
450 where
451 V: de::SeqAccess<'de>,
452 {
453 let mut vec = visitor
454 .size_hint()
455 .map(Vec::with_capacity)
456 .unwrap_or_default();
457
458 while let Some(elem) = visitor.next_element()? {
459 vec.push(elem);
460 }
461
462 Ok(Key::Seq(vec.into()))
463 }
464
465 #[inline]
466 fn visit_map<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
467 where
468 V: de::MapAccess<'de>,
469 {
470 let mut map = visitor
471 .size_hint()
472 .map(Vec::with_capacity)
473 .unwrap_or_default();
474
475 while let Some((key, value)) = visitor.next_entry()? {
476 map.push((key, value));
477 }
478
479 Ok(Key::Map(map.into()))
480 }
481 }
482
483 deserializer.deserialize_any(ValueVisitor::<F>(marker::PhantomData))
484 }
485}
486
487#[cfg(test)]
488mod tests {
489 use crate::RejectFloatPolicy;
490
491 use super::Key;
492
493 #[test]
494 fn assert_default() {
495 assert_eq!(Key::Unit, Key::default());
496 }
497
498 #[test]
499 fn assert_impls() {
500 assert_eq::<Key<RejectFloatPolicy>>();
501 assert_hash::<Key<RejectFloatPolicy>>();
502 assert_ord::<Key<RejectFloatPolicy>>();
503
504 #[cfg(feature = "ordered-float")]
505 {
506 use crate::OrderedFloatPolicy;
507
508 assert_eq::<Key<OrderedFloatPolicy>>();
509 assert_hash::<Key<OrderedFloatPolicy>>();
510 assert_ord::<Key<OrderedFloatPolicy>>();
511 }
512
513 fn assert_eq<T: std::cmp::Eq>() {}
514 fn assert_hash<T: std::hash::Hash>() {}
515 fn assert_ord<T: std::cmp::Ord>() {}
516 }
517}