1use std::borrow::Cow;
2use std::fmt::{Display, Write};
3use std::marker::PhantomData;
4use std::ops::{Deref, DerefMut};
5
6use serde::de::{EnumAccess, MapAccess, SeqAccess, VariantAccess, Visitor};
7use serde::ser::{
8 SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,
9 SerializeTupleStruct, SerializeTupleVariant,
10};
11use serde::{Deserialize, Serialize};
12
13use crate::format::{Float, InnerFloat, InnerInteger, Integer};
14
15#[derive(Debug, Clone)]
18pub enum Value<'a> {
19 None,
21 Unit,
23 Bool(bool),
25 Integer(Integer),
27 Float(Float),
29 Bytes(Cow<'a, [u8]>),
31 String(Cow<'a, str>),
33 Sequence(Vec<Self>),
35 Mappings(Vec<(Self, Self)>),
37}
38
39impl<'a> Value<'a> {
40 #[inline]
66 pub fn from_serialize<T: Serialize>(value: T) -> Result<Self, ValueError> {
67 value.serialize(Serializer)
68 }
69
70 #[inline]
91 pub fn deserialize_as<'de, T: Deserialize<'de>>(&'de self) -> Result<T, ValueError> {
92 T::deserialize(Deserializer(self))
93 }
94
95 #[inline]
103 pub fn from_sequence<IntoIter: IntoIterator<Item = T>, T: Into<Self>>(
104 sequence: IntoIter,
105 ) -> Self {
106 Self::from_iter(sequence)
107 }
108
109 #[inline]
118 pub fn from_mappings<IntoIter: IntoIterator<Item = (K, V)>, K: Into<Self>, V: Into<Self>>(
119 mappings: IntoIter,
120 ) -> Self {
121 Self::from_iter(mappings)
122 }
123
124 #[must_use]
155 #[inline]
156 pub fn is_empty(&self) -> bool {
157 match self {
158 Value::None => true,
159 Value::Unit | Value::Bool(_) | Value::Integer(_) | Value::Float(_) => false,
160 Value::Bytes(value) => value.is_empty(),
161 Value::String(value) => value.is_empty(),
162 Value::Sequence(value) => value.is_empty(),
163 Value::Mappings(value) => value.is_empty(),
164 }
165 }
166
167 #[must_use]
205 #[inline]
206 pub fn as_bool(&self) -> bool {
207 match self {
208 Value::None => false,
209 Value::Unit => true,
210 Value::Bool(value) => *value,
211 Value::Integer(value) => !value.is_zero(),
212 Value::Float(value) => !value.is_zero(),
213 Value::Bytes(value) => !value.is_empty(),
214 Value::String(value) => !value.is_empty(),
215 Value::Sequence(value) => !value.is_empty(),
216 Value::Mappings(value) => !value.is_empty(),
217 }
218 }
219
220 #[must_use]
224 #[inline]
225 pub fn as_integer(&self) -> Option<Integer> {
226 match self {
227 Value::Integer(value) => Some(*value),
228 Value::Float(value) => value.as_integer().ok(),
229 _ => None,
230 }
231 }
232
233 #[must_use]
237 #[inline]
238 pub fn as_float(&self) -> Option<Float> {
239 match self {
240 Value::Integer(value) => value.as_float().ok(),
241 Value::Float(value) => Some(*value),
242 _ => None,
243 }
244 }
245
246 #[must_use]
251 #[inline]
252 pub fn as_str(&self) -> Option<&str> {
253 match self {
254 Self::Bytes(bytes) => std::str::from_utf8(bytes).ok(),
255 Self::String(string) => Some(string),
256 _ => None,
257 }
258 }
259
260 #[must_use]
264 #[inline]
265 pub fn as_bytes(&self) -> Option<&[u8]> {
266 match self {
267 Self::Bytes(bytes) => Some(bytes),
268 Self::String(string) => Some(string.as_bytes()),
269 _ => None,
270 }
271 }
272
273 #[must_use]
278 #[inline]
279 pub fn values(&self) -> ValueIter<'_> {
280 match self {
281 Self::Sequence(sequence) => ValueIter(SequenceIterState::Sequence(sequence.iter())),
282 Self::Mappings(mappings) => ValueIter(SequenceIterState::Mappings(mappings.iter())),
283 _ => ValueIter(SequenceIterState::Sequence([].iter())),
284 }
285 }
286
287 #[inline]
292 pub fn mappings(&self) -> std::slice::Iter<'_, (Self, Self)> {
293 match self {
294 Self::Mappings(mappings) => mappings.iter(),
295 _ => [].iter(),
296 }
297 }
298
299 pub fn into_static(self) -> Value<'static> {
301 match self {
302 Self::None => Value::None,
303 Self::Unit => Value::Unit,
304 Self::Bool(value) => Value::Bool(value),
305 Self::Integer(value) => Value::Integer(value),
306 Self::Float(value) => Value::Float(value),
307 Self::Bytes(Cow::Owned(value)) => Value::Bytes(Cow::Owned(value)),
308 Self::Bytes(Cow::Borrowed(value)) => Value::Bytes(Cow::Owned(value.to_vec())),
309 Self::String(Cow::Owned(value)) => Value::String(Cow::Owned(value)),
310 Self::String(Cow::Borrowed(value)) => Value::String(Cow::Owned(value.to_string())),
311 Self::Sequence(value) => {
312 Value::Sequence(value.into_iter().map(Value::into_static).collect())
313 }
314 Self::Mappings(value) => Value::Mappings(
315 value
316 .into_iter()
317 .map(|(k, v)| (k.into_static(), v.into_static()))
318 .collect(),
319 ),
320 }
321 }
322
323 pub fn to_static(&self) -> Value<'static> {
325 match self {
326 Self::None => Value::None,
327 Self::Unit => Value::Unit,
328 Self::Bool(value) => Value::Bool(*value),
329 Self::Integer(value) => Value::Integer(*value),
330 Self::Float(value) => Value::Float(*value),
331 Self::Bytes(Cow::Owned(value)) => Value::Bytes(Cow::Owned(value.clone())),
332 Self::Bytes(Cow::Borrowed(value)) => Value::Bytes(Cow::Owned(value.to_vec())),
333 Self::String(Cow::Owned(value)) => Value::String(Cow::Owned(value.clone())),
334 Self::String(Cow::Borrowed(value)) => Value::String(Cow::Owned((*value).to_string())),
335 Self::Sequence(value) => Value::Sequence(value.iter().map(Value::to_static).collect()),
336 Self::Mappings(value) => Value::Mappings(
337 value
338 .iter()
339 .map(|(k, v)| (k.to_static(), v.to_static()))
340 .collect(),
341 ),
342 }
343 }
344}
345
346impl<'a, 'b> PartialEq<Value<'b>> for Value<'a> {
347 #[inline]
348 fn eq(&self, other: &Value<'b>) -> bool {
349 match (self, other) {
350 (Self::Bool(l0), Value::Bool(r0)) => l0 == r0,
351 (Self::Integer(l0), Value::Integer(r0)) => l0 == r0,
352 (Self::Float(l0), Value::Float(r0)) => l0 == r0,
353 (Self::Bytes(l0), Value::Bytes(r0)) => l0 == r0,
354 (Self::String(l0), Value::String(r0)) => l0 == r0,
355 (Self::Bytes(l0), Value::String(r0)) => *l0 == r0.as_bytes(),
356 (Self::String(l0), Value::Bytes(r0)) => l0.as_bytes() == &**r0,
357 (Self::Sequence(l0), Value::Sequence(r0)) => l0 == r0,
358 (Self::Mappings(l0), Value::Mappings(r0)) => l0 == r0,
359 _ => core::mem::discriminant(self) == core::mem::discriminant(other),
360 }
361 }
362}
363
364impl<'a> Display for Value<'a> {
365 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
366 match self {
367 Value::None => f.write_str("None"),
368 Value::Unit => f.write_str("()"),
369 Value::Bool(true) => f.write_str("true"),
370 Value::Bool(false) => f.write_str("false"),
371 Value::Integer(value) => Display::fmt(value, f),
372 Value::Float(value) => Display::fmt(value, f),
373 Value::Bytes(bytes) => {
374 f.write_str("0x")?;
375 for (index, byte) in bytes.iter().enumerate() {
376 if index > 0 && index % 4 == 0 {
377 f.write_char('_')?;
378 }
379 write!(f, "{byte:02x}")?;
380 }
381 Ok(())
382 }
383 Value::String(string) => f.write_str(string),
384 Value::Sequence(sequence) => {
385 f.write_char('[')?;
386 for (index, value) in sequence.iter().enumerate() {
387 if index > 0 {
388 f.write_str(", ")?;
389 }
390 Display::fmt(value, f)?;
391 }
392 f.write_char(']')
393 }
394 Value::Mappings(mappings) => {
395 f.write_char('{')?;
396 for (index, (key, value)) in mappings.iter().enumerate() {
397 if index > 0 {
398 f.write_str(", ")?;
399 }
400 Display::fmt(key, f)?;
401 f.write_str(": ")?;
402 Display::fmt(value, f)?;
403 }
404 f.write_char('}')
405 }
406 }
407 }
408}
409
410impl<'a> Serialize for Value<'a> {
411 #[inline]
412 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
413 where
414 S: serde::Serializer,
415 {
416 match self {
417 Value::None => serializer.serialize_none(),
418 Value::Unit => serializer.serialize_unit(),
419 Value::Bool(value) => serializer.serialize_bool(*value),
420 Value::Integer(integer) => match integer.0 {
421 InnerInteger::I8(value) => serializer.serialize_i8(value),
422 InnerInteger::I16(value) => serializer.serialize_i16(value),
423 InnerInteger::I32(value) => serializer.serialize_i32(value),
424 InnerInteger::I64(value) => serializer.serialize_i64(value),
425 InnerInteger::I128(value) => serializer.serialize_i128(value),
426 InnerInteger::U8(value) => serializer.serialize_u8(value),
427 InnerInteger::U16(value) => serializer.serialize_u16(value),
428 InnerInteger::U32(value) => serializer.serialize_u32(value),
429 InnerInteger::U64(value) => serializer.serialize_u64(value),
430 InnerInteger::U128(value) => serializer.serialize_u128(value),
431 },
432 Value::Float(value) => match value.0 {
433 InnerFloat::F64(value) => serializer.serialize_f64(value),
434 InnerFloat::F32(value) => serializer.serialize_f32(value),
435 },
436 Value::Bytes(value) => serializer.serialize_bytes(value),
437 Value::String(value) => serializer.serialize_str(value),
438 Value::Sequence(values) => {
439 let mut seq = serializer.serialize_seq(Some(values.len()))?;
440 for value in values {
441 seq.serialize_element(value)?;
442 }
443 seq.end()
444 }
445 Value::Mappings(keys_and_values) => {
446 let mut map = serializer.serialize_map(Some(keys_and_values.len()))?;
447 for (key, value) in keys_and_values {
448 map.serialize_entry(key, value)?;
449 }
450 map.end()
451 }
452 }
453 }
454}
455
456impl<'de: 'a, 'a> Deserialize<'de> for Value<'a> {
457 #[inline]
458 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
459 where
460 D: serde::Deserializer<'de>,
461 {
462 deserializer.deserialize_any(ValueVisitor::default())
463 }
464}
465
466#[derive(Debug, Clone, PartialEq)]
475pub struct OwnedValue(pub Value<'static>);
476
477impl Deref for OwnedValue {
478 type Target = Value<'static>;
479
480 #[inline]
481 fn deref(&self) -> &Self::Target {
482 &self.0
483 }
484}
485
486impl DerefMut for OwnedValue {
487 #[inline]
488 fn deref_mut(&mut self) -> &mut Self::Target {
489 &mut self.0
490 }
491}
492
493impl Serialize for OwnedValue {
494 #[inline]
495 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
496 where
497 S: serde::Serializer,
498 {
499 self.0.serialize(serializer)
500 }
501}
502
503impl<'de> Deserialize<'de> for OwnedValue {
504 #[inline]
505 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
506 where
507 D: serde::Deserializer<'de>,
508 {
509 deserializer
510 .deserialize_any(ValueVisitor::default())
511 .map(|value| Self(value.into_static()))
512 }
513}
514
515impl<'a> From<Value<'a>> for OwnedValue {
516 #[inline]
517 fn from(value: Value<'a>) -> Self {
518 Self(value.into_static())
519 }
520}
521
522impl<'a> From<&'a Value<'a>> for OwnedValue {
523 #[inline]
524 fn from(value: &'a Value<'a>) -> Self {
525 Self(value.to_static())
526 }
527}
528
529#[derive(Default)]
530struct ValueVisitor<'a>(PhantomData<&'a ()>);
531
532impl<'de: 'a, 'a> Visitor<'de> for ValueVisitor<'a> {
533 type Value = Value<'a>;
534
535 fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
536 formatter.write_str("any value")
537 }
538
539 #[inline]
540 fn visit_none<E>(self) -> Result<Self::Value, E>
541 where
542 E: serde::de::Error,
543 {
544 Ok(Value::None)
545 }
546
547 #[inline]
548 fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
549 where
550 E: serde::de::Error,
551 {
552 Ok(Value::Bool(v))
553 }
554
555 #[inline]
556 fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
557 where
558 E: serde::de::Error,
559 {
560 Ok(Value::Integer(Integer::from(v)))
561 }
562
563 #[inline]
564 fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
565 where
566 E: serde::de::Error,
567 {
568 Ok(Value::Integer(Integer::from(v)))
569 }
570
571 #[inline]
572 fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
573 where
574 E: serde::de::Error,
575 {
576 Ok(Value::Integer(Integer::from(v)))
577 }
578
579 #[inline]
580 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
581 where
582 E: serde::de::Error,
583 {
584 Ok(Value::Integer(Integer::from(v)))
585 }
586
587 #[inline]
588 fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
589 where
590 E: serde::de::Error,
591 {
592 Ok(Value::Integer(Integer::from(v)))
593 }
594
595 #[inline]
596 fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
597 where
598 E: serde::de::Error,
599 {
600 Ok(Value::Integer(Integer::from(v)))
601 }
602
603 #[inline]
604 fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
605 where
606 E: serde::de::Error,
607 {
608 Ok(Value::Integer(Integer::from(v)))
609 }
610
611 #[inline]
612 fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
613 where
614 E: serde::de::Error,
615 {
616 Ok(Value::Integer(Integer::from(v)))
617 }
618
619 #[inline]
620 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
621 where
622 E: serde::de::Error,
623 {
624 Ok(Value::Integer(Integer::from(v)))
625 }
626
627 #[inline]
628 fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
629 where
630 E: serde::de::Error,
631 {
632 Ok(Value::Integer(Integer::from(v)))
633 }
634
635 #[inline]
636 fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
637 where
638 E: serde::de::Error,
639 {
640 Ok(Value::Float(Float::from(v)))
641 }
642
643 #[inline]
644 fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
645 where
646 E: serde::de::Error,
647 {
648 Ok(Value::Float(Float::from(v)))
649 }
650
651 #[inline]
652 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
653 where
654 E: serde::de::Error,
655 {
656 Ok(Value::String(Cow::Owned(v.to_string())))
657 }
658
659 #[inline]
660 fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>
661 where
662 E: serde::de::Error,
663 {
664 Ok(Value::String(Cow::Borrowed(v)))
665 }
666
667 #[inline]
668 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
669 where
670 E: serde::de::Error,
671 {
672 Ok(Value::String(Cow::Owned(v)))
673 }
674
675 #[inline]
676 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
677 where
678 E: serde::de::Error,
679 {
680 Ok(Value::Bytes(Cow::Owned(v.to_vec())))
681 }
682
683 #[inline]
684 fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>
685 where
686 E: serde::de::Error,
687 {
688 Ok(Value::Bytes(Cow::Borrowed(v)))
689 }
690
691 #[inline]
692 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
693 where
694 E: serde::de::Error,
695 {
696 Ok(Value::Bytes(Cow::Owned(v)))
697 }
698
699 #[inline]
700 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
701 where
702 D: serde::Deserializer<'de>,
703 {
704 deserializer.deserialize_any(Self::default())
705 }
706
707 #[inline]
708 fn visit_unit<E>(self) -> Result<Self::Value, E>
709 where
710 E: serde::de::Error,
711 {
712 Ok(Value::Unit)
713 }
714
715 #[inline]
716 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
717 where
718 A: serde::de::SeqAccess<'de>,
719 {
720 let mut values = if let Some(hint) = seq.size_hint() {
721 Vec::with_capacity(hint)
722 } else {
723 Vec::new()
724 };
725 while let Some(value) = seq.next_element()? {
726 values.push(value);
727 }
728 Ok(Value::Sequence(values))
729 }
730
731 #[inline]
732 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
733 where
734 A: serde::de::MapAccess<'de>,
735 {
736 let mut values = if let Some(hint) = map.size_hint() {
737 Vec::with_capacity(hint)
738 } else {
739 Vec::new()
740 };
741 while let Some(value) = map.next_entry()? {
742 values.push(value);
743 }
744 Ok(Value::Mappings(values))
745 }
746}
747
748impl<'a> From<Option<Value<'a>>> for Value<'a> {
749 #[inline]
750 fn from(value: Option<Value<'a>>) -> Self {
751 if let Some(value) = value {
752 value
753 } else {
754 Value::None
755 }
756 }
757}
758
759impl<'a> From<()> for Value<'a> {
760 #[inline]
761 fn from(_: ()) -> Self {
762 Value::Unit
763 }
764}
765
766impl<'a> From<bool> for Value<'a> {
767 #[inline]
768 fn from(value: bool) -> Self {
769 Value::Bool(value)
770 }
771}
772
773macro_rules! define_value_from_primitive {
774 ($container:ident, $variant:ident, $primitive:ty) => {
775 impl<'a> From<$primitive> for Value<'a> {
776 #[inline]
777 fn from(value: $primitive) -> Self {
778 Self::$container($container::from(value))
779 }
780 }
781 };
782}
783
784define_value_from_primitive!(Integer, U8, u8);
785define_value_from_primitive!(Integer, U16, u16);
786define_value_from_primitive!(Integer, U32, u32);
787define_value_from_primitive!(Integer, U64, u64);
788define_value_from_primitive!(Integer, U128, u128);
789
790define_value_from_primitive!(Integer, I8, i8);
791define_value_from_primitive!(Integer, I16, i16);
792define_value_from_primitive!(Integer, I32, i32);
793define_value_from_primitive!(Integer, I64, i64);
794define_value_from_primitive!(Integer, I128, i128);
795
796define_value_from_primitive!(Float, F32, f32);
797define_value_from_primitive!(Float, F64, f64);
798
799impl<'a> From<&'a [u8]> for Value<'a> {
800 #[inline]
801 fn from(bytes: &'a [u8]) -> Self {
802 Self::Bytes(Cow::Borrowed(bytes))
803 }
804}
805
806impl<'a> From<Vec<u8>> for Value<'a> {
807 #[inline]
808 fn from(bytes: Vec<u8>) -> Self {
809 Self::Bytes(Cow::Owned(bytes))
810 }
811}
812
813impl<'a, const N: usize> From<&'a [u8; N]> for Value<'a> {
814 #[inline]
815 fn from(bytes: &'a [u8; N]) -> Self {
816 Self::Bytes(Cow::Borrowed(bytes))
817 }
818}
819
820impl<'a> From<&'a str> for Value<'a> {
821 #[inline]
822 fn from(string: &'a str) -> Self {
823 Self::String(Cow::Borrowed(string))
824 }
825}
826
827impl<'a> From<String> for Value<'a> {
828 #[inline]
829 fn from(string: String) -> Self {
830 Self::String(Cow::Owned(string))
831 }
832}
833
834impl<'a> From<Vec<Value<'a>>> for Value<'a> {
835 #[inline]
836 fn from(value: Vec<Value<'a>>) -> Self {
837 Self::Sequence(value)
838 }
839}
840
841impl<'a> From<Vec<(Value<'a>, Value<'a>)>> for Value<'a> {
842 #[inline]
843 fn from(value: Vec<(Value<'a>, Value<'a>)>) -> Self {
844 Self::Mappings(value)
845 }
846}
847
848impl<'a, A> FromIterator<A> for Value<'a>
849where
850 A: Into<Value<'a>>,
851{
852 #[inline]
853 fn from_iter<T: IntoIterator<Item = A>>(iter: T) -> Self {
854 Self::from(iter.into_iter().map(A::into).collect::<Vec<_>>())
855 }
856}
857
858impl<'a, K, V> FromIterator<(K, V)> for Value<'a>
859where
860 K: Into<Value<'a>>,
861 V: Into<Value<'a>>,
862{
863 #[inline]
864 fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
865 Self::from(
866 iter.into_iter()
867 .map(|(k, v)| (k.into(), v.into()))
868 .collect::<Vec<_>>(),
869 )
870 }
871}
872
873pub struct ValueIter<'a>(SequenceIterState<'a>);
875
876enum SequenceIterState<'a> {
877 Sequence(std::slice::Iter<'a, Value<'a>>),
878 Mappings(std::slice::Iter<'a, (Value<'a>, Value<'a>)>),
879}
880
881impl<'a> Iterator for ValueIter<'a> {
882 type Item = &'a Value<'a>;
883
884 #[inline]
885 fn next(&mut self) -> Option<Self::Item> {
886 match &mut self.0 {
887 SequenceIterState::Sequence(sequence) => sequence.next(),
888 SequenceIterState::Mappings(mappings) => mappings.next().map(|(_k, v)| v),
889 }
890 }
891}
892
893impl<'a> ExactSizeIterator for ValueIter<'a> {
894 fn len(&self) -> usize {
895 match &self.0 {
896 SequenceIterState::Sequence(iter) => iter.len(),
897 SequenceIterState::Mappings(iter) => iter.len(),
898 }
899 }
900}
901
902impl<'a> DoubleEndedIterator for ValueIter<'a> {
903 fn next_back(&mut self) -> Option<Self::Item> {
904 match &mut self.0 {
905 SequenceIterState::Sequence(iter) => iter.next_back(),
906 SequenceIterState::Mappings(iter) => iter.next_back().map(|(_k, v)| v),
907 }
908 }
909}
910
911#[test]
912#[allow(clippy::cognitive_complexity)]
913fn value_display_tests() {
914 assert_eq!(Value::None.to_string(), "None");
916 assert_eq!(Value::Unit.to_string(), "()");
917
918 assert_eq!(Value::Bool(false).to_string(), "false");
920 assert_eq!(Value::Bool(true).to_string(), "true");
921
922 assert_eq!(Value::from(1_u8).to_string(), "1");
924 assert_eq!(Value::from(1_u16).to_string(), "1");
925 assert_eq!(Value::from(1_u32).to_string(), "1");
926 assert_eq!(Value::from(1_u64).to_string(), "1");
927 assert_eq!(Value::from(1_u128).to_string(), "1");
928 assert_eq!(Value::from(1_i8).to_string(), "1");
929 assert_eq!(Value::from(1_i16).to_string(), "1");
930 assert_eq!(Value::from(1_i32).to_string(), "1");
931 assert_eq!(Value::from(1_i64).to_string(), "1");
932 assert_eq!(Value::from(1_i128).to_string(), "1");
933
934 assert_eq!(Value::from(1.1_f32).to_string(), "1.1");
936 assert_eq!(Value::from(1.1_f64).to_string(), "1.1");
937
938 assert_eq!(Value::from(b"\xFE\xED\xD0\xD0").to_string(), "0xfeedd0d0");
940 assert_eq!(
941 Value::from(b"\xFE\xED\xD0\xD0\xDE\xAD\xBE\xEF").to_string(),
942 "0xfeedd0d0_deadbeef"
943 );
944
945 assert_eq!(Value::from("hello world").to_string(), "hello world");
947
948 assert_eq!(
950 Value::from_sequence(Vec::<Value<'_>>::new()).to_string(),
951 "[]"
952 );
953 assert_eq!(
954 Value::from_sequence(vec![Value::None]).to_string(),
955 "[None]"
956 );
957 assert_eq!(
958 Value::from_sequence(vec![Value::None, Value::Unit]).to_string(),
959 "[None, ()]"
960 );
961
962 assert_eq!(
964 Value::from_mappings(Vec::<(Value<'_>, Value<'_>)>::new()).to_string(),
965 "{}"
966 );
967 assert_eq!(
968 Value::from_mappings(vec![(Value::from(0_u8), Value::None)]).to_string(),
969 "{0: None}"
970 );
971 assert_eq!(
972 Value::from_mappings(vec![
973 (Value::from(0_u8), Value::None),
974 (Value::from(1_u8), Value::Unit)
975 ])
976 .to_string(),
977 "{0: None, 1: ()}"
978 );
979}
980
981#[test]
982#[allow(clippy::manual_assert)] fn value_as_float_tests() {
984 approx::assert_relative_eq!(
985 Value::from(u8::MAX)
986 .as_float()
987 .expect("u8 conversion failed")
988 .as_f32()
989 .expect("f32 conversion failed"),
990 255_f32,
991 );
992 approx::assert_relative_eq!(
993 Value::from(u32::MAX)
994 .as_float()
995 .expect("u32 conversion failed")
996 .as_f64(),
997 4_294_967_295_f64,
998 );
999 assert!(Value::from(u32::MAX)
1000 .as_float()
1001 .expect("u32 conversion failed")
1002 .as_f32()
1003 .is_err());
1004
1005 approx::assert_relative_eq!(Value::from(0_f64).as_float().unwrap().as_f32().unwrap(), 0.);
1006}
1007
1008#[test]
1009fn value_as_integer_tests() {
1010 macro_rules! test_signed {
1011 ($primitive:ty, $signed_method:ident, $unsigned:ty, $unsigned_method:ident, $float:ty) => {
1012 assert_eq!(
1013 Value::from(<$primitive>::MAX)
1014 .as_integer()
1015 .expect("integer conversion failed")
1016 .$signed_method()
1017 .unwrap(),
1018 <$primitive>::MAX,
1019 );
1020 assert_eq!(
1021 Value::from(<$primitive>::MIN)
1022 .as_integer()
1023 .expect("integer conversion failed")
1024 .$signed_method()
1025 .unwrap(),
1026 <$primitive>::MIN,
1027 );
1028 assert_eq!(
1029 Value::from(<$primitive>::MAX)
1030 .as_integer()
1031 .expect("integer conversion failed")
1032 .$unsigned_method()
1033 .unwrap(),
1034 <$unsigned>::try_from(<$primitive>::MAX).unwrap(),
1035 );
1036
1037 assert_eq!(
1038 Value::from(<$float>::from(<$primitive>::MAX))
1039 .as_integer()
1040 .expect("integer conversion failed")
1041 .$signed_method()
1042 .unwrap(),
1043 <$primitive>::MAX,
1044 );
1045 assert_eq!(
1046 Value::from(<$float>::from(<$primitive>::MIN))
1047 .as_integer()
1048 .expect("integer conversion failed")
1049 .$signed_method()
1050 .unwrap(),
1051 <$primitive>::MIN,
1052 );
1053 assert_eq!(
1054 Value::from(<$float>::from(<$primitive>::MAX))
1055 .as_integer()
1056 .expect("integer conversion failed")
1057 .$unsigned_method()
1058 .unwrap(),
1059 <$unsigned>::try_from(<$primitive>::MAX).unwrap(),
1060 );
1061 };
1062 }
1063
1064 test_signed!(i8, as_i8, u8, as_u8, f32);
1065 test_signed!(i16, as_i16, u16, as_u16, f32);
1066 test_signed!(i32, as_i32, u32, as_u32, f64);
1067
1068 macro_rules! test_unsigned {
1069 ($primitive:ty, $unsigned_method:ident, $signed:ty, $signed_method:ident, $float:ty) => {
1070 assert_eq!(
1071 Value::from(<$primitive>::MAX)
1072 .as_integer()
1073 .expect("integer conversion failed")
1074 .$unsigned_method()
1075 .unwrap(),
1076 <$primitive>::MAX,
1077 );
1078 assert!(Value::from(<$primitive>::MAX)
1079 .as_integer()
1080 .expect("integer conversion failed")
1081 .$signed_method()
1082 .is_err());
1083 assert_eq!(
1084 Value::from(<$float>::from(<$primitive>::MAX))
1085 .as_integer()
1086 .expect("integer conversion failed")
1087 .$unsigned_method()
1088 .unwrap(),
1089 <$primitive>::MAX,
1090 );
1091 assert!(Value::from(<$float>::from(<$primitive>::MAX))
1092 .as_integer()
1093 .expect("integer conversion failed")
1094 .$signed_method()
1095 .is_err());
1096 };
1097 }
1098
1099 test_unsigned!(u8, as_u8, i8, as_i8, f32);
1100 test_unsigned!(u16, as_u16, i16, as_i16, f32);
1101 test_unsigned!(u32, as_u32, i32, as_i32, f64);
1102}
1103
1104struct Serializer;
1105
1106impl serde::Serializer for Serializer {
1107 type Error = ValueError;
1108 type Ok = Value<'static>;
1109 type SerializeMap = MappingsSerializer;
1110 type SerializeSeq = SequenceSerializer;
1111 type SerializeStruct = MappingsSerializer;
1112 type SerializeStructVariant = StructVariantSerializer;
1113 type SerializeTuple = SequenceSerializer;
1114 type SerializeTupleStruct = SequenceSerializer;
1115 type SerializeTupleVariant = TupleVariantSerializer;
1116
1117 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
1118 Ok(Value::Bool(v))
1119 }
1120
1121 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
1122 Ok(Value::Integer(Integer::from(v)))
1123 }
1124
1125 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
1126 Ok(Value::Integer(Integer::from(v)))
1127 }
1128
1129 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
1130 Ok(Value::Integer(Integer::from(v)))
1131 }
1132
1133 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
1134 Ok(Value::Integer(Integer::from(v)))
1135 }
1136
1137 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
1138 Ok(Value::Integer(Integer::from(v)))
1139 }
1140
1141 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
1142 Ok(Value::Integer(Integer::from(v)))
1143 }
1144
1145 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
1146 Ok(Value::Integer(Integer::from(v)))
1147 }
1148
1149 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
1150 Ok(Value::Integer(Integer::from(v)))
1151 }
1152
1153 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
1154 Ok(Value::Integer(Integer::from(v)))
1155 }
1156
1157 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
1158 Ok(Value::Integer(Integer::from(v)))
1159 }
1160
1161 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
1162 Ok(Value::Float(Float::from(v)))
1163 }
1164
1165 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
1166 Ok(Value::Float(Float::from(v)))
1167 }
1168
1169 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
1170 Ok(Value::Integer(Integer::from(u32::from(v))))
1171 }
1172
1173 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
1174 Ok(Value::String(Cow::Owned(v.to_string())))
1175 }
1176
1177 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
1178 Ok(Value::Bytes(Cow::Owned(v.to_vec())))
1179 }
1180
1181 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
1182 Ok(Value::None)
1183 }
1184
1185 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
1186 where
1187 T: Serialize + ?Sized,
1188 {
1189 value.serialize(Self)
1190 }
1191
1192 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
1193 Ok(Value::Unit)
1194 }
1195
1196 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
1197 Ok(Value::Unit)
1198 }
1199
1200 fn serialize_unit_variant(
1201 self,
1202 _name: &'static str,
1203 _variant_index: u32,
1204 variant: &'static str,
1205 ) -> Result<Self::Ok, Self::Error> {
1206 Ok(Value::String(Cow::Borrowed(variant)))
1207 }
1208
1209 fn serialize_newtype_struct<T>(
1210 self,
1211 _name: &'static str,
1212 value: &T,
1213 ) -> Result<Self::Ok, Self::Error>
1214 where
1215 T: Serialize + ?Sized,
1216 {
1217 value.serialize(Self)
1218 }
1219
1220 fn serialize_newtype_variant<T>(
1221 self,
1222 _name: &'static str,
1223 _variant_index: u32,
1224 variant: &'static str,
1225 value: &T,
1226 ) -> Result<Self::Ok, Self::Error>
1227 where
1228 T: Serialize + ?Sized,
1229 {
1230 Ok(Value::Mappings(vec![(
1231 Value::String(Cow::Borrowed(variant)),
1232 value.serialize(Self)?,
1233 )]))
1234 }
1235
1236 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
1237 Ok(SequenceSerializer(
1238 len.map_or_else(Vec::new, Vec::with_capacity),
1239 ))
1240 }
1241
1242 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
1243 Ok(SequenceSerializer(Vec::with_capacity(len)))
1244 }
1245
1246 fn serialize_tuple_struct(
1247 self,
1248 _name: &'static str,
1249 len: usize,
1250 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
1251 Ok(SequenceSerializer(Vec::with_capacity(len)))
1252 }
1253
1254 fn serialize_tuple_variant(
1255 self,
1256 _name: &'static str,
1257 _variant_index: u32,
1258 variant: &'static str,
1259 len: usize,
1260 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
1261 Ok(TupleVariantSerializer {
1262 variant,
1263 sequence: Vec::with_capacity(len),
1264 })
1265 }
1266
1267 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
1268 Ok(MappingsSerializer(
1269 len.map_or_else(Vec::new, Vec::with_capacity),
1270 ))
1271 }
1272
1273 fn serialize_struct(
1274 self,
1275 _name: &'static str,
1276 len: usize,
1277 ) -> Result<Self::SerializeStruct, Self::Error> {
1278 Ok(MappingsSerializer(Vec::with_capacity(len)))
1279 }
1280
1281 fn serialize_struct_variant(
1282 self,
1283 _name: &'static str,
1284 _variant_index: u32,
1285 variant: &'static str,
1286 len: usize,
1287 ) -> Result<Self::SerializeStructVariant, Self::Error> {
1288 Ok(StructVariantSerializer {
1289 variant,
1290 mappings: Vec::with_capacity(len),
1291 })
1292 }
1293}
1294
1295struct SequenceSerializer(Vec<Value<'static>>);
1296
1297impl SerializeSeq for SequenceSerializer {
1298 type Error = ValueError;
1299 type Ok = Value<'static>;
1300
1301 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
1302 where
1303 T: Serialize + ?Sized,
1304 {
1305 self.0.push(value.serialize(Serializer)?);
1306 Ok(())
1307 }
1308
1309 fn end(self) -> Result<Self::Ok, Self::Error> {
1310 Ok(Value::Sequence(self.0))
1311 }
1312}
1313
1314impl SerializeTuple for SequenceSerializer {
1315 type Error = ValueError;
1316 type Ok = Value<'static>;
1317
1318 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
1319 where
1320 T: Serialize + ?Sized,
1321 {
1322 self.0.push(value.serialize(Serializer)?);
1323 Ok(())
1324 }
1325
1326 fn end(self) -> Result<Self::Ok, Self::Error> {
1327 Ok(Value::Sequence(self.0))
1328 }
1329}
1330
1331impl SerializeTupleStruct for SequenceSerializer {
1332 type Error = ValueError;
1333 type Ok = Value<'static>;
1334
1335 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
1336 where
1337 T: Serialize + ?Sized,
1338 {
1339 self.0.push(value.serialize(Serializer)?);
1340 Ok(())
1341 }
1342
1343 fn end(self) -> Result<Self::Ok, Self::Error> {
1344 Ok(Value::Sequence(self.0))
1345 }
1346}
1347
1348struct TupleVariantSerializer {
1349 variant: &'static str,
1350 sequence: Vec<Value<'static>>,
1351}
1352
1353impl SerializeTupleVariant for TupleVariantSerializer {
1354 type Error = ValueError;
1355 type Ok = Value<'static>;
1356
1357 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
1358 where
1359 T: Serialize + ?Sized,
1360 {
1361 self.sequence.push(value.serialize(Serializer)?);
1362 Ok(())
1363 }
1364
1365 fn end(self) -> Result<Self::Ok, Self::Error> {
1366 Ok(Value::Mappings(vec![(
1367 Value::String(Cow::Borrowed(self.variant)),
1368 Value::Sequence(self.sequence),
1369 )]))
1370 }
1371}
1372
1373struct MappingsSerializer(Vec<(Value<'static>, Value<'static>)>);
1374
1375impl SerializeMap for MappingsSerializer {
1376 type Error = ValueError;
1377 type Ok = Value<'static>;
1378
1379 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
1380 where
1381 T: Serialize + ?Sized,
1382 {
1383 self.0.push((key.serialize(Serializer)?, Value::None));
1384 Ok(())
1385 }
1386
1387 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
1388 where
1389 T: Serialize + ?Sized,
1390 {
1391 self.0
1392 .last_mut()
1393 .expect("serialize_value called without serialize_key")
1394 .1 = value.serialize(Serializer)?;
1395 Ok(())
1396 }
1397
1398 fn end(self) -> Result<Self::Ok, Self::Error> {
1399 Ok(Value::Mappings(self.0))
1400 }
1401}
1402
1403impl SerializeStruct for MappingsSerializer {
1404 type Error = ValueError;
1405 type Ok = Value<'static>;
1406
1407 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
1408 where
1409 T: Serialize + ?Sized,
1410 {
1411 self.0.push((
1412 Value::String(Cow::Borrowed(key)),
1413 value.serialize(Serializer)?,
1414 ));
1415 Ok(())
1416 }
1417
1418 fn end(self) -> Result<Self::Ok, Self::Error> {
1419 Ok(Value::Mappings(self.0))
1420 }
1421}
1422
1423struct StructVariantSerializer {
1424 variant: &'static str,
1425 mappings: Vec<(Value<'static>, Value<'static>)>,
1426}
1427
1428impl SerializeStructVariant for StructVariantSerializer {
1429 type Error = ValueError;
1430 type Ok = Value<'static>;
1431
1432 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
1433 where
1434 T: Serialize + ?Sized,
1435 {
1436 self.mappings.push((
1437 Value::String(Cow::Borrowed(key)),
1438 value.serialize(Serializer)?,
1439 ));
1440 Ok(())
1441 }
1442
1443 fn end(self) -> Result<Self::Ok, Self::Error> {
1444 Ok(Value::Mappings(vec![(
1445 Value::String(Cow::Borrowed(self.variant)),
1446 Value::Mappings(self.mappings),
1447 )]))
1448 }
1449}
1450
1451struct Deserializer<'de>(&'de Value<'de>);
1452
1453impl<'de> serde::Deserializer<'de> for Deserializer<'de> {
1454 type Error = ValueError;
1455
1456 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1457 where
1458 V: Visitor<'de>,
1459 {
1460 match &self.0 {
1461 Value::None => visitor.visit_none(),
1462 Value::Unit => visitor.visit_unit(),
1463 Value::Bool(value) => visitor.visit_bool(*value),
1464 Value::Integer(integer) => match integer.0 {
1465 InnerInteger::I8(value) => visitor.visit_i8(value),
1466 InnerInteger::I16(value) => visitor.visit_i16(value),
1467 InnerInteger::I32(value) => visitor.visit_i32(value),
1468 InnerInteger::I64(value) => visitor.visit_i64(value),
1469 InnerInteger::I128(value) => visitor.visit_i128(value),
1470 InnerInteger::U8(value) => visitor.visit_u8(value),
1471 InnerInteger::U16(value) => visitor.visit_u16(value),
1472 InnerInteger::U32(value) => visitor.visit_u32(value),
1473 InnerInteger::U64(value) => visitor.visit_u64(value),
1474 InnerInteger::U128(value) => visitor.visit_u128(value),
1475 },
1476 Value::Float(float) => match float.0 {
1477 InnerFloat::F64(value) => visitor.visit_f64(value),
1478 InnerFloat::F32(value) => visitor.visit_f32(value),
1479 },
1480 Value::Bytes(bytes) => visitor.visit_bytes(bytes),
1481 Value::String(str) => visitor.visit_str(str),
1482 Value::Sequence(seq) => visitor.visit_seq(SequenceDeserializer(seq)),
1483 Value::Mappings(mappings) => visitor.visit_map(MappingsDeserializer(mappings)),
1484 }
1485 }
1486
1487 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1488 where
1489 V: Visitor<'de>,
1490 {
1491 if let Value::Bool(value) = &self.0 {
1492 visitor.visit_bool(*value)
1493 } else {
1494 Err(ValueError::Expected {
1495 kind: "bool",
1496 value: self.0.to_static(),
1497 })
1498 }
1499 }
1500
1501 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1502 where
1503 V: Visitor<'de>,
1504 {
1505 if let Value::Integer(value) = &self.0 {
1506 if let Ok(value) = value.as_i8() {
1507 return visitor.visit_i8(value);
1508 }
1509 }
1510
1511 Err(ValueError::Expected {
1512 kind: "i8",
1513 value: self.0.to_static(),
1514 })
1515 }
1516
1517 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1518 where
1519 V: Visitor<'de>,
1520 {
1521 if let Value::Integer(value) = &self.0 {
1522 if let Ok(value) = value.as_i16() {
1523 return visitor.visit_i16(value);
1524 }
1525 }
1526
1527 Err(ValueError::Expected {
1528 kind: "i16",
1529 value: self.0.to_static(),
1530 })
1531 }
1532
1533 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1534 where
1535 V: Visitor<'de>,
1536 {
1537 if let Value::Integer(value) = &self.0 {
1538 if let Ok(value) = value.as_i32() {
1539 return visitor.visit_i32(value);
1540 }
1541 }
1542
1543 Err(ValueError::Expected {
1544 kind: "i32",
1545 value: self.0.to_static(),
1546 })
1547 }
1548
1549 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1550 where
1551 V: Visitor<'de>,
1552 {
1553 if let Value::Integer(value) = &self.0 {
1554 if let Ok(value) = value.as_i64() {
1555 return visitor.visit_i64(value);
1556 }
1557 }
1558
1559 Err(ValueError::Expected {
1560 kind: "i64",
1561 value: self.0.to_static(),
1562 })
1563 }
1564
1565 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1566 where
1567 V: Visitor<'de>,
1568 {
1569 if let Value::Integer(value) = &self.0 {
1570 if let Ok(value) = value.as_i128() {
1571 return visitor.visit_i128(value);
1572 }
1573 }
1574
1575 Err(ValueError::Expected {
1576 kind: "i128",
1577 value: self.0.to_static(),
1578 })
1579 }
1580
1581 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1582 where
1583 V: Visitor<'de>,
1584 {
1585 if let Value::Integer(value) = &self.0 {
1586 if let Ok(value) = value.as_u8() {
1587 return visitor.visit_u8(value);
1588 }
1589 }
1590
1591 Err(ValueError::Expected {
1592 kind: "u8",
1593 value: self.0.to_static(),
1594 })
1595 }
1596
1597 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1598 where
1599 V: Visitor<'de>,
1600 {
1601 if let Value::Integer(value) = &self.0 {
1602 if let Ok(value) = value.as_u16() {
1603 return visitor.visit_u16(value);
1604 }
1605 }
1606
1607 Err(ValueError::Expected {
1608 kind: "u16",
1609 value: self.0.to_static(),
1610 })
1611 }
1612
1613 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1614 where
1615 V: Visitor<'de>,
1616 {
1617 if let Value::Integer(value) = &self.0 {
1618 if let Ok(value) = value.as_u32() {
1619 return visitor.visit_u32(value);
1620 }
1621 }
1622
1623 Err(ValueError::Expected {
1624 kind: "u32",
1625 value: self.0.to_static(),
1626 })
1627 }
1628
1629 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1630 where
1631 V: Visitor<'de>,
1632 {
1633 if let Value::Integer(value) = &self.0 {
1634 if let Ok(value) = value.as_u64() {
1635 return visitor.visit_u64(value);
1636 }
1637 }
1638
1639 Err(ValueError::Expected {
1640 kind: "u64",
1641 value: self.0.to_static(),
1642 })
1643 }
1644
1645 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1646 where
1647 V: Visitor<'de>,
1648 {
1649 if let Value::Integer(value) = &self.0 {
1650 if let Ok(value) = value.as_u128() {
1651 return visitor.visit_u128(value);
1652 }
1653 }
1654
1655 Err(ValueError::Expected {
1656 kind: "u128",
1657 value: self.0.to_static(),
1658 })
1659 }
1660
1661 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1662 where
1663 V: Visitor<'de>,
1664 {
1665 if let Value::Float(value) = &self.0 {
1666 if let Ok(value) = value.as_f32() {
1667 return visitor.visit_f32(value);
1668 }
1669 }
1670
1671 Err(ValueError::Expected {
1672 kind: "f32",
1673 value: self.0.to_static(),
1674 })
1675 }
1676
1677 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1678 where
1679 V: Visitor<'de>,
1680 {
1681 if let Value::Float(value) = &self.0 {
1682 visitor.visit_f64(value.as_f64())
1683 } else {
1684 Err(ValueError::Expected {
1685 kind: "f64",
1686 value: self.0.to_static(),
1687 })
1688 }
1689 }
1690
1691 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1692 where
1693 V: Visitor<'de>,
1694 {
1695 if let Value::Integer(value) = &self.0 {
1696 if let Ok(value) = value.as_u32() {
1697 if let Ok(char) = char::try_from(value) {
1698 return visitor.visit_char(char);
1699 }
1700 }
1701 }
1702
1703 Err(ValueError::Expected {
1704 kind: "char",
1705 value: self.0.to_static(),
1706 })
1707 }
1708
1709 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1710 where
1711 V: Visitor<'de>,
1712 {
1713 if let Value::String(value) = &self.0 {
1714 visitor.visit_borrowed_str(value)
1715 } else {
1716 Err(ValueError::Expected {
1717 kind: "str",
1718 value: self.0.to_static(),
1719 })
1720 }
1721 }
1722
1723 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1724 where
1725 V: Visitor<'de>,
1726 {
1727 if let Value::String(value) = &self.0 {
1728 visitor.visit_borrowed_str(value)
1729 } else {
1730 Err(ValueError::Expected {
1731 kind: "String",
1732 value: self.0.to_static(),
1733 })
1734 }
1735 }
1736
1737 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1738 where
1739 V: Visitor<'de>,
1740 {
1741 if let Value::Bytes(value) = &self.0 {
1742 visitor.visit_borrowed_bytes(value)
1743 } else {
1744 Err(ValueError::Expected {
1745 kind: "bytes",
1746 value: self.0.to_static(),
1747 })
1748 }
1749 }
1750
1751 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1752 where
1753 V: Visitor<'de>,
1754 {
1755 if let Value::Bytes(value) = &self.0 {
1756 visitor.visit_borrowed_bytes(value)
1757 } else {
1758 Err(ValueError::Expected {
1759 kind: "byte buf",
1760 value: self.0.to_static(),
1761 })
1762 }
1763 }
1764
1765 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1766 where
1767 V: Visitor<'de>,
1768 {
1769 if matches!(&self.0, Value::None) {
1770 visitor.visit_none()
1771 } else {
1772 visitor.visit_some(self)
1773 }
1774 }
1775
1776 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1777 where
1778 V: Visitor<'de>,
1779 {
1780 if let Value::Unit = &self.0 {
1781 visitor.visit_unit()
1782 } else {
1783 Err(ValueError::Expected {
1784 kind: "()",
1785 value: self.0.to_static(),
1786 })
1787 }
1788 }
1789
1790 fn deserialize_unit_struct<V>(
1791 self,
1792 _name: &'static str,
1793 visitor: V,
1794 ) -> Result<V::Value, Self::Error>
1795 where
1796 V: Visitor<'de>,
1797 {
1798 if let Value::Unit = &self.0 {
1799 visitor.visit_unit()
1800 } else {
1801 Err(ValueError::Expected {
1802 kind: "()",
1803 value: self.0.to_static(),
1804 })
1805 }
1806 }
1807
1808 fn deserialize_newtype_struct<V>(
1809 self,
1810 _name: &'static str,
1811 visitor: V,
1812 ) -> Result<V::Value, Self::Error>
1813 where
1814 V: Visitor<'de>,
1815 {
1816 visitor.visit_newtype_struct(self)
1817 }
1818
1819 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1820 where
1821 V: Visitor<'de>,
1822 {
1823 if let Value::Sequence(sequence) = &self.0 {
1824 visitor.visit_seq(SequenceDeserializer(sequence))
1825 } else {
1826 Err(ValueError::Expected {
1827 kind: "sequence",
1828 value: self.0.to_static(),
1829 })
1830 }
1831 }
1832
1833 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
1834 where
1835 V: Visitor<'de>,
1836 {
1837 if let Value::Sequence(sequence) = &self.0 {
1838 visitor.visit_seq(SequenceDeserializer(sequence))
1839 } else {
1840 Err(ValueError::Expected {
1841 kind: "tuple",
1842 value: self.0.to_static(),
1843 })
1844 }
1845 }
1846
1847 fn deserialize_tuple_struct<V>(
1848 self,
1849 _name: &'static str,
1850 _len: usize,
1851 visitor: V,
1852 ) -> Result<V::Value, Self::Error>
1853 where
1854 V: Visitor<'de>,
1855 {
1856 if let Value::Sequence(sequence) = &self.0 {
1857 visitor.visit_seq(SequenceDeserializer(sequence))
1858 } else {
1859 Err(ValueError::Expected {
1860 kind: "tuple struct",
1861 value: self.0.to_static(),
1862 })
1863 }
1864 }
1865
1866 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1867 where
1868 V: Visitor<'de>,
1869 {
1870 if let Value::Mappings(sequence) = &self.0 {
1871 visitor.visit_map(MappingsDeserializer(sequence))
1872 } else {
1873 Err(ValueError::Expected {
1874 kind: "map",
1875 value: self.0.to_static(),
1876 })
1877 }
1878 }
1879
1880 fn deserialize_struct<V>(
1881 self,
1882 _name: &'static str,
1883 _fields: &'static [&'static str],
1884 visitor: V,
1885 ) -> Result<V::Value, Self::Error>
1886 where
1887 V: Visitor<'de>,
1888 {
1889 if let Value::Mappings(sequence) = &self.0 {
1890 visitor.visit_map(MappingsDeserializer(sequence))
1891 } else {
1892 Err(ValueError::Expected {
1893 kind: "map",
1894 value: self.0.to_static(),
1895 })
1896 }
1897 }
1898
1899 fn deserialize_enum<V>(
1900 self,
1901 _name: &'static str,
1902 _variants: &'static [&'static str],
1903 visitor: V,
1904 ) -> Result<V::Value, Self::Error>
1905 where
1906 V: Visitor<'de>,
1907 {
1908 visitor.visit_enum(self)
1909 }
1910
1911 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1912 where
1913 V: Visitor<'de>,
1914 {
1915 self.deserialize_str(visitor)
1916 }
1917
1918 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1919 where
1920 V: Visitor<'de>,
1921 {
1922 self.deserialize_any(visitor)
1923 }
1924}
1925
1926impl<'de> EnumAccess<'de> for Deserializer<'de> {
1927 type Error = ValueError;
1928 type Variant = Self;
1929
1930 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
1931 where
1932 V: serde::de::DeserializeSeed<'de>,
1933 {
1934 match &self.0 {
1935 Value::Mappings(mapping) => {
1936 if !mapping.is_empty() {
1937 let variant = seed.deserialize(Deserializer(&mapping[0].0))?;
1938 return Ok((variant, Deserializer(&mapping[0].1)));
1939 }
1940 }
1941 Value::String(_) => {
1942 let variant = seed.deserialize(Deserializer(self.0))?;
1943 return Ok((variant, Deserializer(&Value::Unit)));
1944 }
1945 _ => {}
1946 }
1947
1948 Err(ValueError::Expected {
1949 kind: "enum variant",
1950 value: self.0.to_static(),
1951 })
1952 }
1953}
1954
1955impl<'de> VariantAccess<'de> for Deserializer<'de> {
1956 type Error = ValueError;
1957
1958 fn unit_variant(self) -> Result<(), Self::Error> {
1959 if matches!(self.0, Value::Unit) {
1960 Ok(())
1961 } else {
1962 Err(ValueError::Expected {
1963 kind: "unit",
1964 value: self.0.to_static(),
1965 })
1966 }
1967 }
1968
1969 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
1970 where
1971 T: serde::de::DeserializeSeed<'de>,
1972 {
1973 seed.deserialize(self)
1974 }
1975
1976 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
1977 where
1978 V: Visitor<'de>,
1979 {
1980 if let Value::Sequence(sequence) = &self.0 {
1981 visitor.visit_seq(SequenceDeserializer(sequence))
1982 } else {
1983 Err(ValueError::Expected {
1984 kind: "tuple variant",
1985 value: self.0.to_static(),
1986 })
1987 }
1988 }
1989
1990 fn struct_variant<V>(
1991 self,
1992 _fields: &'static [&'static str],
1993 visitor: V,
1994 ) -> Result<V::Value, Self::Error>
1995 where
1996 V: Visitor<'de>,
1997 {
1998 if let Value::Mappings(mappings) = &self.0 {
1999 visitor.visit_map(MappingsDeserializer(mappings))
2000 } else {
2001 Err(ValueError::Expected {
2002 kind: "struct variant",
2003 value: self.0.to_static(),
2004 })
2005 }
2006 }
2007}
2008
2009struct SequenceDeserializer<'de>(&'de [Value<'de>]);
2010
2011impl<'de> SeqAccess<'de> for SequenceDeserializer<'de> {
2012 type Error = ValueError;
2013
2014 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
2015 where
2016 T: serde::de::DeserializeSeed<'de>,
2017 {
2018 if self.0.is_empty() {
2019 Ok(None)
2020 } else {
2021 let value = seed.deserialize(Deserializer(&self.0[0]))?;
2022 self.0 = &self.0[1..];
2023 Ok(Some(value))
2024 }
2025 }
2026
2027 fn size_hint(&self) -> Option<usize> {
2028 Some(self.0.len())
2029 }
2030}
2031
2032struct MappingsDeserializer<'de>(&'de [(Value<'de>, Value<'de>)]);
2033
2034impl<'de> MapAccess<'de> for MappingsDeserializer<'de> {
2035 type Error = ValueError;
2036
2037 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
2038 where
2039 K: serde::de::DeserializeSeed<'de>,
2040 {
2041 if self.0.is_empty() {
2042 Ok(None)
2043 } else {
2044 let key = seed.deserialize(Deserializer(&self.0[0].0))?;
2045 Ok(Some(key))
2046 }
2047 }
2048
2049 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
2050 where
2051 V: serde::de::DeserializeSeed<'de>,
2052 {
2053 let value = seed.deserialize(Deserializer(&self.0[0].1))?;
2054 self.0 = &self.0[1..];
2055 Ok(value)
2056 }
2057
2058 fn size_hint(&self) -> Option<usize> {
2059 Some(self.0.len())
2060 }
2061}
2062
2063#[derive(Debug, PartialEq)]
2065pub enum ValueError {
2066 Expected {
2069 kind: &'static str,
2071 value: Value<'static>,
2073 },
2074 Custom(String),
2076}
2077
2078impl std::error::Error for ValueError {}
2079
2080impl Display for ValueError {
2081 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2082 match self {
2083 ValueError::Expected { kind, value } => write!(f, "expected {kind} but got {value}"),
2084 ValueError::Custom(msg) => f.write_str(msg),
2085 }
2086 }
2087}
2088
2089impl serde::de::Error for ValueError {
2090 fn custom<T>(msg: T) -> Self
2091 where
2092 T: Display,
2093 {
2094 Self::Custom(msg.to_string())
2095 }
2096}
2097
2098impl serde::ser::Error for ValueError {
2099 fn custom<T>(msg: T) -> Self
2100 where
2101 T: Display,
2102 {
2103 Self::Custom(msg.to_string())
2104 }
2105}
2106
2107#[test]
2108fn is_empty() {
2109 for expected_empty in [
2110 Value::None,
2111 Value::Bytes(Cow::Borrowed(b"")),
2112 Value::String(Cow::Borrowed("")),
2113 Value::Sequence(vec![]),
2114 Value::Mappings(vec![]),
2115 ] {
2116 assert!(expected_empty.is_empty(), "{expected_empty} was not empty");
2117 }
2118 for expected_not_empty in [
2119 Value::Unit,
2120 Value::Bool(true),
2121 Value::Integer(Integer::from(0)),
2122 Value::Float(Float::from(0f32)),
2123 Value::Bytes(Cow::Borrowed(b"a")),
2124 Value::String(Cow::Borrowed("a")),
2125 Value::Sequence(vec![Value::None]),
2126 Value::Mappings(vec![(Value::None, Value::None)]),
2127 ] {
2128 assert!(
2129 !expected_not_empty.is_empty(),
2130 "{expected_not_empty} was empty"
2131 );
2132 }
2133}
2134
2135#[test]
2136fn as_bool() {
2137 for expected_true in [
2138 Value::Unit,
2139 Value::Bool(true),
2140 Value::Integer(Integer::from(1)),
2141 Value::Float(Float::from(1f32)),
2142 Value::Bytes(Cow::Borrowed(b"a")),
2143 Value::String(Cow::Borrowed("a")),
2144 Value::Sequence(vec![Value::None]),
2145 Value::Mappings(vec![(Value::None, Value::None)]),
2146 ] {
2147 assert!(expected_true.as_bool(), "{expected_true} was false");
2148 }
2149 for expected_false in [
2150 Value::None,
2151 Value::Bool(false),
2152 Value::Integer(Integer::from(0)),
2153 Value::Float(Float::from(0f32)),
2154 Value::Bytes(Cow::Borrowed(b"")),
2155 Value::String(Cow::Borrowed("")),
2156 Value::Sequence(vec![]),
2157 Value::Mappings(vec![]),
2158 ] {
2159 assert!(!expected_false.as_bool(), "{expected_false} was true");
2160 }
2161}
2162
2163#[test]
2164fn as_integer() {
2165 assert_eq!(
2166 Value::from(1_i32).as_integer().unwrap().as_i32().unwrap(),
2167 1
2168 );
2169 assert_eq!(
2170 Value::from(1_f32).as_integer().unwrap().as_i32().unwrap(),
2171 1
2172 );
2173 assert_eq!(Value::from(true).as_integer(), None);
2174}
2175
2176#[test]
2177fn as_float() {
2178 approx::assert_abs_diff_eq!(
2179 Value::from(1_i32).as_float().unwrap().as_f32().unwrap(),
2180 1_f32
2181 );
2182
2183 approx::assert_abs_diff_eq!(
2184 Value::from(1_f32).as_float().unwrap().as_f32().unwrap(),
2185 1_f32
2186 );
2187 assert_eq!(Value::from(true).as_float(), None);
2188}
2189
2190#[test]
2191fn as_str() {
2192 assert_eq!(Value::from("asdf").as_str(), Some("asdf"));
2193 assert_eq!(Value::from(b"asdf").as_str(), Some("asdf"));
2194 assert_eq!(Value::from(false).as_str(), None);
2195}
2196
2197#[test]
2198fn as_bytes() {
2199 assert_eq!(Value::from(b"asdf").as_bytes(), Some(&b"asdf"[..]));
2200 assert_eq!(Value::from("asdf").as_bytes(), Some(&b"asdf"[..]));
2201 assert_eq!(Value::from(false).as_bytes(), None);
2202}
2203
2204#[test]
2205fn values() {
2206 assert_eq!(
2207 Value::from_sequence([Value::Bool(true), Value::Bool(false)])
2208 .values()
2209 .collect::<Vec<_>>(),
2210 &[&Value::Bool(true), &Value::Bool(false)]
2211 );
2212 assert_eq!(
2213 Value::from_mappings([(0, Value::Bool(true)), (1, Value::Bool(false))])
2214 .values()
2215 .collect::<Vec<_>>(),
2216 &[&Value::Bool(true), &Value::Bool(false)]
2217 );
2218 assert_eq!(Value::from(None).values().count(), 0);
2219}
2220
2221#[test]
2222fn mappings() {
2223 assert_eq!(
2224 Value::from_sequence([Value::Bool(true), Value::Bool(false)])
2225 .mappings()
2226 .cloned()
2227 .collect::<Vec<_>>(),
2228 &[]
2229 );
2230 assert_eq!(
2231 Value::from_mappings([(0, Value::Bool(true)), (1, Value::Bool(false))])
2232 .mappings()
2233 .collect::<Vec<_>>(),
2234 &[
2235 &(Value::from(0), Value::Bool(true)),
2236 &(Value::from(1), Value::Bool(false))
2237 ]
2238 );
2239 assert!(Value::from(false).mappings().collect::<Vec<_>>().is_empty());
2240}
2241
2242#[test]
2243fn into_static() {
2244 for borrowed in [
2245 Value::from(None),
2246 Value::from(Some(Value::from(()))),
2247 Value::from(true),
2248 Value::from(1_i32),
2249 Value::from(1_f32),
2250 Value::from(&b"hi"[..]),
2251 Value::from("hi"),
2252 Value::from_sequence([1]),
2253 Value::from_mappings([(1, 2)]),
2254 ] {
2255 let cloned = borrowed.clone();
2256 let s = borrowed.to_static();
2257 assert_eq!(borrowed.to_static(), borrowed);
2258 assert_eq!(borrowed, s.to_static());
2261
2262 assert_eq!(borrowed.into_static(), cloned);
2263 assert_eq!(cloned, s.into_static());
2264 }
2265}
2266
2267#[test]
2268fn owned_deref() {
2269 let mut owned_value = OwnedValue::from(&Value::from("hello".to_string()));
2270 assert_eq!(owned_value.as_str(), Some("hello"));
2271 let Value::String(Cow::Owned(str)) = &mut *owned_value else {
2272 unreachable!()
2273 };
2274 str.push_str(", world");
2275 assert_eq!(owned_value.as_str(), Some("hello, world"));
2276}
2277
2278#[test]
2279fn owned_serialization() {
2280 let owned_value = OwnedValue::from(Value::from(b"asdf".to_vec()));
2281 let serialized = crate::to_vec(&owned_value).unwrap();
2282 let deserialized_owned: OwnedValue = crate::from_slice(&serialized).unwrap();
2283 assert_eq!(deserialized_owned, owned_value);
2284}