1use std::{
4 cmp::{Eq, Ordering},
5 hash::{Hash, Hasher},
6 iter::FromIterator,
7 ops::{Index, IndexMut},
8};
9
10use serde::{
11 de::{DeserializeOwned, DeserializeSeed, Deserializer, MapAccess, SeqAccess, Visitor},
12 forward_to_deserialize_any,
13};
14use serde_derive::{Deserialize, Serialize};
15
16use crate::{de::Error, error::Result};
17
18#[derive(Clone, Debug, Default, Deserialize, Serialize)]
25#[serde(transparent)]
26pub struct Map(MapInner);
27
28impl Map {
29 pub fn new() -> Map {
31 Default::default()
32 }
33
34 pub fn len(&self) -> usize {
36 self.0.len()
37 }
38
39 pub fn is_empty(&self) -> bool {
41 self.0.len() == 0
42 }
43
44 pub fn insert(&mut self, key: Value, value: Value) -> Option<Value> {
47 self.0.insert(key, value)
48 }
49
50 pub fn remove(&mut self, key: &Value) -> Option<Value> {
52 self.0.remove(key)
53 }
54
55 pub fn iter(&self) -> impl Iterator<Item = (&Value, &Value)> + DoubleEndedIterator {
57 self.0.iter()
58 }
59
60 pub fn iter_mut(&mut self) -> impl Iterator<Item = (&Value, &mut Value)> + DoubleEndedIterator {
62 self.0.iter_mut()
63 }
64
65 pub fn keys(&self) -> impl Iterator<Item = &Value> + DoubleEndedIterator {
67 self.0.keys()
68 }
69
70 pub fn values(&self) -> impl Iterator<Item = &Value> + DoubleEndedIterator {
72 self.0.values()
73 }
74
75 pub fn values_mut(&mut self) -> impl Iterator<Item = &mut Value> + DoubleEndedIterator {
77 self.0.values_mut()
78 }
79
80 pub fn retain<F>(&mut self, keep: F)
87 where
88 F: FnMut(&Value, &mut Value) -> bool,
89 {
90 self.0.retain(keep);
91 }
92}
93
94impl FromIterator<(Value, Value)> for Map {
95 fn from_iter<T: IntoIterator<Item = (Value, Value)>>(iter: T) -> Self {
96 Map(MapInner::from_iter(iter))
97 }
98}
99
100impl IntoIterator for Map {
101 type Item = (Value, Value);
102
103 type IntoIter = <MapInner as IntoIterator>::IntoIter;
104
105 fn into_iter(self) -> Self::IntoIter {
106 self.0.into_iter()
107 }
108}
109
110impl Eq for Map {}
112
113impl Hash for Map {
114 fn hash<H: Hasher>(&self, state: &mut H) {
115 self.iter().for_each(|x| x.hash(state));
116 }
117}
118
119impl Index<&Value> for Map {
120 type Output = Value;
121
122 fn index(&self, index: &Value) -> &Self::Output {
123 &self.0[index]
124 }
125}
126
127impl IndexMut<&Value> for Map {
128 fn index_mut(&mut self, index: &Value) -> &mut Self::Output {
129 self.0.get_mut(index).expect("no entry found for key")
130 }
131}
132
133impl Ord for Map {
134 fn cmp(&self, other: &Map) -> Ordering {
135 self.iter().cmp(other.iter())
136 }
137}
138
139impl PartialEq for Map {
141 fn eq(&self, other: &Map) -> bool {
142 self.iter().zip(other.iter()).all(|(a, b)| a == b)
143 }
144}
145
146impl PartialOrd for Map {
147 fn partial_cmp(&self, other: &Map) -> Option<Ordering> {
148 self.iter().partial_cmp(other.iter())
149 }
150}
151
152#[cfg(not(feature = "indexmap"))]
153type MapInner = std::collections::BTreeMap<Value, Value>;
154#[cfg(feature = "indexmap")]
155type MapInner = indexmap::IndexMap<Value, Value>;
156
157#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Eq, Hash, Ord)]
159pub enum Number {
160 Integer(i64),
161 Float(Float),
162}
163
164#[derive(Copy, Clone, Debug)]
167pub struct Float(f64);
168
169impl Float {
170 pub fn new(v: f64) -> Self {
172 Float(v)
173 }
174
175 pub fn get(self) -> f64 {
177 self.0
178 }
179}
180
181impl Number {
182 pub fn new(v: impl Into<Number>) -> Self {
184 v.into()
185 }
186
187 pub fn into_f64(self) -> f64 {
200 self.map_to(|i| i as f64, |f| f)
201 }
202
203 pub fn as_f64(self) -> Option<f64> {
215 self.map_to(|_| None, Some)
216 }
217
218 pub fn as_i64(self) -> Option<i64> {
230 self.map_to(Some, |_| None)
231 }
232
233 pub fn map_to<T>(
245 self,
246 integer_fn: impl FnOnce(i64) -> T,
247 float_fn: impl FnOnce(f64) -> T,
248 ) -> T {
249 match self {
250 Number::Integer(i) => integer_fn(i),
251 Number::Float(Float(f)) => float_fn(f),
252 }
253 }
254}
255
256impl From<f64> for Number {
257 fn from(f: f64) -> Number {
258 Number::Float(Float(f))
259 }
260}
261
262impl From<i64> for Number {
263 fn from(i: i64) -> Number {
264 Number::Integer(i)
265 }
266}
267
268impl From<i32> for Number {
269 fn from(i: i32) -> Number {
270 Number::Integer(i64::from(i))
271 }
272}
273
274impl From<u64> for Number {
279 fn from(i: u64) -> Number {
280 if i <= std::i64::MAX as u64 {
281 Number::Integer(i as i64)
282 } else {
283 Number::new(i as f64)
284 }
285 }
286}
287
288impl PartialEq for Float {
293 fn eq(&self, other: &Self) -> bool {
294 self.0.is_nan() && other.0.is_nan() || self.0 == other.0
295 }
296}
297
298impl Eq for Float {}
303
304impl Hash for Float {
305 fn hash<H: Hasher>(&self, state: &mut H) {
306 state.write_u64(self.0.to_bits());
307 }
308}
309
310impl PartialOrd for Float {
322 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
323 match (self.0.is_nan(), other.0.is_nan()) {
324 (true, true) => Some(Ordering::Equal),
325 (true, false) => Some(Ordering::Less),
326 (false, true) => Some(Ordering::Greater),
327 _ => self.0.partial_cmp(&other.0),
328 }
329 }
330}
331
332impl Ord for Float {
338 fn cmp(&self, other: &Self) -> Ordering {
339 self.partial_cmp(other).expect("Bug: Contract violation")
340 }
341}
342
343#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
344pub enum Value {
345 Bool(bool),
346 Char(char),
347 Map(Map),
348 Number(Number),
349 Option(Option<Box<Value>>),
350 String(String),
351 Seq(Vec<Value>),
352 Unit,
353}
354
355impl Value {
356 pub fn into_rust<T>(self) -> Result<T>
358 where
359 T: DeserializeOwned,
360 {
361 T::deserialize(self)
362 }
363}
364
365impl<'de> Deserializer<'de> for Value {
368 type Error = Error;
369
370 forward_to_deserialize_any! {
371 bool f32 f64 char str string bytes
372 byte_buf option unit unit_struct newtype_struct seq tuple
373 tuple_struct map struct enum identifier ignored_any
374 }
375
376 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
377 where
378 V: Visitor<'de>,
379 {
380 match self {
381 Value::Bool(b) => visitor.visit_bool(b),
382 Value::Char(c) => visitor.visit_char(c),
383 Value::Map(m) => {
384 let old_len = m.len();
385
386 let mut items: Vec<(Value, Value)> = m.into_iter().collect();
387 items.reverse();
388
389 let value = visitor.visit_map(MapAccessor {
390 items: &mut items,
391 value: None,
392 })?;
393
394 if items.is_empty() {
395 Ok(value)
396 } else {
397 Err(Error::ExpectedDifferentLength {
398 expected: format!("a map of length {}", old_len - items.len()),
399 found: old_len,
400 })
401 }
402 }
403 Value::Number(Number::Float(ref f)) => visitor.visit_f64(f.get()),
404 Value::Number(Number::Integer(i)) => visitor.visit_i64(i),
405 Value::Option(Some(o)) => visitor.visit_some(*o),
406 Value::Option(None) => visitor.visit_none(),
407 Value::String(s) => visitor.visit_string(s),
408 Value::Seq(mut seq) => {
409 let old_len = seq.len();
410
411 seq.reverse();
412 let value = visitor.visit_seq(Seq { seq: &mut seq })?;
413
414 if seq.is_empty() {
415 Ok(value)
416 } else {
417 Err(Error::ExpectedDifferentLength {
418 expected: format!("a sequence of length {}", old_len - seq.len()),
419 found: old_len,
420 })
421 }
422 }
423 Value::Unit => visitor.visit_unit(),
424 }
425 }
426
427 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
428 where
429 V: Visitor<'de>,
430 {
431 self.deserialize_i64(visitor)
432 }
433
434 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
435 where
436 V: Visitor<'de>,
437 {
438 self.deserialize_i64(visitor)
439 }
440
441 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
442 where
443 V: Visitor<'de>,
444 {
445 self.deserialize_i64(visitor)
446 }
447
448 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
449 where
450 V: Visitor<'de>,
451 {
452 match self {
453 Value::Number(Number::Integer(i)) => visitor.visit_i64(i),
454 v => Err(Error::Message(format!("Expected a number, got {:?}", v))),
455 }
456 }
457
458 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
459 where
460 V: Visitor<'de>,
461 {
462 self.deserialize_u64(visitor)
463 }
464
465 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
466 where
467 V: Visitor<'de>,
468 {
469 self.deserialize_u64(visitor)
470 }
471
472 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
473 where
474 V: Visitor<'de>,
475 {
476 self.deserialize_u64(visitor)
477 }
478
479 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
480 where
481 V: Visitor<'de>,
482 {
483 match self {
484 Value::Number(Number::Integer(i)) => visitor.visit_u64(i as u64),
485 v => Err(Error::Message(format!("Expected a number, got {:?}", v))),
486 }
487 }
488}
489
490struct MapAccessor<'a> {
491 items: &'a mut Vec<(Value, Value)>,
492 value: Option<Value>,
493}
494
495impl<'a, 'de> MapAccess<'de> for MapAccessor<'a> {
496 type Error = Error;
497
498 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
499 where
500 K: DeserializeSeed<'de>,
501 {
502 match self.items.pop() {
504 Some((key, value)) => {
505 self.value = Some(value);
506 seed.deserialize(key).map(Some)
507 }
508 None => Ok(None),
509 }
510 }
511
512 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
513 where
514 V: DeserializeSeed<'de>,
515 {
516 match self.value.take() {
517 Some(value) => seed.deserialize(value),
518 None => panic!("Contract violation: value before key"),
519 }
520 }
521
522 fn size_hint(&self) -> Option<usize> {
523 Some(self.items.len())
524 }
525}
526
527struct Seq<'a> {
528 seq: &'a mut Vec<Value>,
529}
530
531impl<'a, 'de> SeqAccess<'de> for Seq<'a> {
532 type Error = Error;
533
534 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
535 where
536 T: DeserializeSeed<'de>,
537 {
538 self.seq
540 .pop()
541 .map_or(Ok(None), |v| seed.deserialize(v).map(Some))
542 }
543
544 fn size_hint(&self) -> Option<usize> {
545 Some(self.seq.len())
546 }
547}
548
549#[cfg(test)]
550mod tests {
551 use std::{collections::BTreeMap, fmt::Debug};
552
553 use serde::Deserialize;
554
555 use super::*;
556
557 fn assert_same<'de, T>(s: &'de str)
558 where
559 T: Debug + Deserialize<'de> + PartialEq,
560 {
561 use crate::de::from_str;
562
563 let direct: T = from_str(s).unwrap();
564 let value: Value = from_str(s).unwrap();
565 let value = T::deserialize(value).unwrap();
566
567 assert_eq!(direct, value, "Deserialization for {:?} is not the same", s);
568 }
569
570 #[test]
571 fn boolean() {
572 assert_same::<bool>("true");
573 assert_same::<bool>("false");
574 }
575
576 #[test]
577 fn float() {
578 assert_same::<f64>("0.123");
579 assert_same::<f64>("-4.19");
580 }
581
582 #[test]
583 fn int() {
584 assert_same::<u32>("626");
585 assert_same::<i32>("-50");
586 }
587
588 #[test]
589 fn char() {
590 assert_same::<char>("'4'");
591 assert_same::<char>("'c'");
592 }
593
594 #[test]
595 fn map() {
596 assert_same::<BTreeMap<char, String>>(
597 "{
598'a': \"Hello\",
599'b': \"Bye\",
600 }",
601 );
602 }
603
604 #[test]
605 fn option() {
606 assert_same::<Option<char>>("Some('a')");
607 assert_same::<Option<char>>("None");
608 }
609
610 #[test]
611 fn seq() {
612 assert_same::<Vec<f64>>("[1.0, 2.0, 3.0, 4.0]");
613 }
614
615 #[test]
616 fn unit() {
617 assert_same::<()>("()");
618 }
619}