1
use std::borrow::Cow;
2
use std::fmt::{Display, Write};
3
use std::marker::PhantomData;
4
use std::ops::{Deref, DerefMut};
5

            
6
use serde::de::{EnumAccess, MapAccess, SeqAccess, VariantAccess, Visitor};
7
use serde::ser::{
8
    SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,
9
    SerializeTupleStruct, SerializeTupleVariant,
10
};
11
use serde::{Deserialize, Serialize};
12

            
13
use crate::format::{Float, InnerFloat, InnerInteger, Integer};
14

            
15
/// A Pot-encoded value. This type can be used to deserialize to and from Pot
16
/// without knowing the original data structure.
17
12
#[derive(Debug, Clone)]
18
pub enum Value<'a> {
19
    /// A value representing `None`.
20
    None,
21
    /// A value representing unit (`()`).
22
    Unit,
23
    /// A boolean value
24
    Bool(bool),
25
    /// An integer value.
26
    Integer(Integer),
27
    /// A floating point value.
28
    Float(Float),
29
    /// A value containing arbitrary bytes.
30
    Bytes(Cow<'a, [u8]>),
31
    /// A string value.
32
    String(Cow<'a, str>),
33
    /// A sequence of values.
34
    Sequence(Vec<Self>),
35
    /// A sequence of key-value mappings.
36
    Mappings(Vec<(Self, Self)>),
37
}
38

            
39
impl<'a> Value<'a> {
40
    /// Creates a `Value` from the given Serde-compatible type.
41
    ///
42
    /// ```rust
43
    /// # fn test() -> Result<(), pot::ValueError> {
44
    /// use pot::Value;
45
    /// use serde_derive::Serialize;
46
    ///
47
    /// #[derive(Serialize, Debug)]
48
    /// enum Example {
49
    ///     Hello,
50
    ///     World,
51
    /// }
52
    ///
53
    /// let original = vec![Example::Hello, Example::World];
54
    /// let serialized = Value::from_serialize(&original)?;
55
    /// assert_eq!(
56
    ///     serialized,
57
    ///     Value::Sequence(vec![
58
    ///         Value::from(String::from("Hello")),
59
    ///         Value::from(String::from("World"))
60
    ///     ])
61
    /// );
62
    /// # Ok(())
63
    /// # }
64
    /// ```
65
    #[inline]
66
11
    pub fn from_serialize<T: Serialize>(value: T) -> Result<Self, ValueError> {
67
11
        value.serialize(Serializer)
68
11
    }
69

            
70
    /// Attempts to create an instance of `T` from this value.
71
    ///
72
    /// ```rust
73
    /// # fn test() -> Result<(), pot::ValueError> {
74
    /// use pot::Value;
75
    /// use serde_derive::{Deserialize, Serialize};
76
    ///
77
    /// #[derive(Serialize, Deserialize, Debug, Eq, PartialEq)]
78
    /// enum Example {
79
    ///     Hello,
80
    ///     World,
81
    /// }
82
    ///
83
    /// let original = vec![Example::Hello, Example::World];
84
    /// let serialized = Value::from_serialize(&original)?;
85
    /// let deserialized: Vec<Example> = serialized.deserialize_as()?;
86
    /// assert_eq!(deserialized, original);
87
    /// # Ok(())
88
    /// # }
89
    /// ```
90
    #[inline]
91
10
    pub fn deserialize_as<'de, T: Deserialize<'de>>(&'de self) -> Result<T, ValueError> {
92
10
        T::deserialize(Deserializer(self))
93
10
    }
94

            
95
    /// Returns a new value from an iterator of items that can be converted into a value.
96
    ///
97
    /// ```rust
98
    /// # use pot::Value;
99
    /// let mappings = Value::from_sequence(Vec::<String>::new());
100
    /// assert!(matches!(mappings, Value::Sequence(_)));
101
    /// ```
102
    #[inline]
103
6
    pub fn from_sequence<IntoIter: IntoIterator<Item = T>, T: Into<Self>>(
104
6
        sequence: IntoIter,
105
6
    ) -> Self {
106
6
        Self::from_iter(sequence)
107
6
    }
108

            
109
    /// Returns a new value from an iterator of 2-element tuples representing key-value pairs.
110
    ///
111
    /// ```rust
112
    /// # use pot::Value;
113
    /// # use std::collections::HashMap;
114
    /// let mappings = Value::from_mappings(HashMap::<String, u32>::new());
115
    /// assert!(matches!(mappings, Value::Mappings(_)));
116
    /// ```
117
    #[inline]
118
6
    pub fn from_mappings<IntoIter: IntoIterator<Item = (K, V)>, K: Into<Self>, V: Into<Self>>(
119
6
        mappings: IntoIter,
120
6
    ) -> Self {
121
6
        Self::from_iter(mappings)
122
6
    }
123

            
124
    /// Returns `true` if the value contained is considered empty.
125
    ///
126
    /// ```rust
127
    /// # use pot::Value;
128
    /// // Value::None is always empty.
129
    /// assert_eq!(Value::None.is_empty(), true);
130
    ///
131
    /// // All primitive values, including Unit, are always not empty, even if they contain the value 0.
132
    /// assert_eq!(Value::Unit.is_empty(), false);
133
    /// assert_eq!(Value::from(false).is_empty(), false);
134
    /// assert_eq!(Value::from(0_u8).is_empty(), false);
135
    /// assert_eq!(Value::from(0_f32).is_empty(), false);
136
    ///
137
    /// // For all other types, having a length of 0 will result in is_empty returning true.
138
    /// assert_eq!(Value::from(Vec::<u8>::new()).is_empty(), true);
139
    /// assert_eq!(Value::from(b"").is_empty(), true);
140
    /// assert_eq!(Value::from(vec![0_u8]).is_empty(), false);
141
    ///
142
    /// assert_eq!(Value::from("").is_empty(), true);
143
    /// assert_eq!(Value::from("hi").is_empty(), false);
144
    ///
145
    /// assert_eq!(Value::Sequence(Vec::new()).is_empty(), true);
146
    /// assert_eq!(Value::from(vec![Value::None]).is_empty(), false);
147
    ///
148
    /// assert_eq!(Value::Mappings(Vec::new()).is_empty(), true);
149
    /// assert_eq!(
150
    ///     Value::from(vec![(Value::None, Value::None)]).is_empty(),
151
    ///     false
152
    /// );
153
    /// ```
154
    #[must_use]
155
    #[inline]
156
13
    pub fn is_empty(&self) -> bool {
157
13
        match self {
158
1
            Value::None => true,
159
4
            Value::Unit | Value::Bool(_) | Value::Integer(_) | Value::Float(_) => false,
160
2
            Value::Bytes(value) => value.is_empty(),
161
2
            Value::String(value) => value.is_empty(),
162
2
            Value::Sequence(value) => value.is_empty(),
163
2
            Value::Mappings(value) => value.is_empty(),
164
        }
165
13
    }
166

            
167
    /// Returns the value as a `bool`.
168
    ///
169
    /// ```rust
170
    /// # use pot::Value;
171
    /// // Value::None is always false.
172
    /// assert_eq!(Value::None.as_bool(), false);
173
    ///
174
    /// // Value::Unit is always true.
175
    /// assert_eq!(Value::Unit.as_bool(), true);
176
    ///
177
    /// // Value::Bool will return the contained value
178
    /// assert_eq!(Value::from(false).as_bool(), false);
179
    /// assert_eq!(Value::from(true).as_bool(), true);
180
    ///
181
    /// // All primitive values return true if the value is non-zero.
182
    /// assert_eq!(Value::from(0_u8).as_bool(), false);
183
    /// assert_eq!(Value::from(1_u8).as_bool(), true);
184
    /// assert_eq!(Value::from(0_f32).as_bool(), false);
185
    /// assert_eq!(Value::from(1_f32).as_bool(), true);
186
    ///
187
    /// // For all other types, as_bool() returns the result of `!is_empty()`.
188
    /// assert_eq!(Value::from(Vec::<u8>::new()).as_bool(), false);
189
    /// assert_eq!(Value::from(b"").as_bool(), false);
190
    /// assert_eq!(Value::from(vec![0_u8]).as_bool(), true);
191
    ///
192
    /// assert_eq!(Value::from("").as_bool(), false);
193
    /// assert_eq!(Value::from("hi").as_bool(), true);
194
    ///
195
    /// assert_eq!(Value::Sequence(Vec::new()).as_bool(), false);
196
    /// assert_eq!(Value::from(vec![Value::None]).as_bool(), true);
197
    ///
198
    /// assert_eq!(Value::Mappings(Vec::new()).as_bool(), false);
199
    /// assert_eq!(
200
    ///     Value::from(vec![(Value::None, Value::None)]).as_bool(),
201
    ///     true
202
    /// );
203
    /// ```
204
    #[must_use]
205
    #[inline]
206
16
    pub fn as_bool(&self) -> bool {
207
16
        match self {
208
1
            Value::None => false,
209
1
            Value::Unit => true,
210
2
            Value::Bool(value) => *value,
211
2
            Value::Integer(value) => !value.is_zero(),
212
2
            Value::Float(value) => !value.is_zero(),
213
2
            Value::Bytes(value) => !value.is_empty(),
214
2
            Value::String(value) => !value.is_empty(),
215
2
            Value::Sequence(value) => !value.is_empty(),
216
2
            Value::Mappings(value) => !value.is_empty(),
217
        }
218
16
    }
219

            
220
    /// Returns the value as an [`Integer`]. Returns `None` if the value is not a
221
    /// [`Self::Float`] or [`Self::Integer`]. Also returns `None` if the value is
222
    /// a float, but cannot be losslessly converted to an integer.
223
    #[must_use]
224
    #[inline]
225
33
    pub fn as_integer(&self) -> Option<Integer> {
226
33
        match self {
227
16
            Value::Integer(value) => Some(*value),
228
16
            Value::Float(value) => value.as_integer().ok(),
229
1
            _ => None,
230
        }
231
33
    }
232

            
233
    /// Returns the value as an [`Float`]. Returns `None` if the value is not a
234
    /// [`Self::Float`] or [`Self::Integer`]. Also returns `None` if the value is
235
    /// an integer, but cannot be losslessly converted to a float.
236
    #[must_use]
237
    #[inline]
238
7
    pub fn as_float(&self) -> Option<Float> {
239
7
        match self {
240
4
            Value::Integer(value) => value.as_float().ok(),
241
2
            Value::Float(value) => Some(*value),
242
1
            _ => None,
243
        }
244
7
    }
245

            
246
    /// Returns the value as a string, or `None` if the value is not representable
247
    /// by a string. This will only return a value with variants
248
    /// [`Self::String`] and [`Self::Bytes`]. Bytes will only be returned if the
249
    /// contained bytes can be safely interpretted as UTF-8.
250
    #[must_use]
251
    #[inline]
252
5
    pub fn as_str(&self) -> Option<&str> {
253
5
        match self {
254
1
            Self::Bytes(bytes) => std::str::from_utf8(bytes).ok(),
255
3
            Self::String(string) => Some(string),
256
1
            _ => None,
257
        }
258
5
    }
259

            
260
    /// Returns the value as bytes, or `None` if the value is not stored as a
261
    /// representation of bytes. This will only return a value with variants
262
    /// [`Self::String`] and [`Self::Bytes`].
263
    #[must_use]
264
    #[inline]
265
3
    pub fn as_bytes(&self) -> Option<&[u8]> {
266
3
        match self {
267
1
            Self::Bytes(bytes) => Some(bytes),
268
1
            Self::String(string) => Some(string.as_bytes()),
269
1
            _ => None,
270
        }
271
3
    }
272

            
273
    /// Returns an iterator that iterates over all values contained inside of
274
    /// this value. Returns an empty iterator if not a [`Self::Sequence`] or
275
    /// [`Self::Mappings`]. If a [`Self::Mappings`], only the value portion of
276
    /// the mapping is returned.
277
    #[must_use]
278
    #[inline]
279
3
    pub fn values(&self) -> ValueIter<'_> {
280
3
        match self {
281
1
            Self::Sequence(sequence) => ValueIter(SequenceIterState::Sequence(sequence.iter())),
282
1
            Self::Mappings(mappings) => ValueIter(SequenceIterState::Mappings(mappings.iter())),
283
1
            _ => ValueIter(SequenceIterState::Sequence([].iter())),
284
        }
285
3
    }
286

            
287
    /// Returns an iterator that iterates over all mappings contained inside of
288
    /// this value. Returns an empty iterator if not a [`Self::Sequence`] or
289
    /// [`Self::Mappings`]. If a [`Self::Sequence`], the key will always be
290
    /// `Self::None`.
291
    #[inline]
292
3
    pub fn mappings(&self) -> std::slice::Iter<'_, (Self, Self)> {
293
3
        match self {
294
1
            Self::Mappings(mappings) => mappings.iter(),
295
2
            _ => [].iter(),
296
        }
297
3
    }
298

            
299
    /// Converts `self` to a `'static` lifetime by cloning any borrowed data.
300
    pub fn into_static(self) -> Value<'static> {
301
6
        match self {
302
2
            Self::None => Value::None,
303
2
            Self::Unit => Value::Unit,
304
2
            Self::Bool(value) => Value::Bool(value),
305
8
            Self::Integer(value) => Value::Integer(value),
306
2
            Self::Float(value) => Value::Float(value),
307
2
            Self::Bytes(Cow::Owned(value)) => Value::Bytes(Cow::Owned(value)),
308
1
            Self::Bytes(Cow::Borrowed(value)) => Value::Bytes(Cow::Owned(value.to_vec())),
309
1
            Self::String(Cow::Owned(value)) => Value::String(Cow::Owned(value)),
310
2
            Self::String(Cow::Borrowed(value)) => Value::String(Cow::Owned(value.to_string())),
311
2
            Self::Sequence(value) => {
312
2
                Value::Sequence(value.into_iter().map(Value::into_static).collect())
313
            }
314
2
            Self::Mappings(value) => Value::Mappings(
315
2
                value
316
2
                    .into_iter()
317
2
                    .map(|(k, v)| (k.into_static(), v.into_static()))
318
2
                    .collect(),
319
2
            ),
320
        }
321
26
    }
322

            
323
    /// Converts `self` to a `'static` lifetime by cloning all data.
324
    pub fn to_static(&self) -> Value<'static> {
325
7
        match self {
326
3
            Self::None => Value::None,
327
3
            Self::Unit => Value::Unit,
328
3
            Self::Bool(value) => Value::Bool(*value),
329
12
            Self::Integer(value) => Value::Integer(*value),
330
3
            Self::Float(value) => Value::Float(*value),
331
1
            Self::Bytes(Cow::Owned(value)) => Value::Bytes(Cow::Owned(value.clone())),
332
2
            Self::Bytes(Cow::Borrowed(value)) => Value::Bytes(Cow::Owned(value.to_vec())),
333
2
            Self::String(Cow::Owned(value)) => Value::String(Cow::Owned(value.clone())),
334
2
            Self::String(Cow::Borrowed(value)) => Value::String(Cow::Owned((*value).to_string())),
335
3
            Self::Sequence(value) => Value::Sequence(value.iter().map(Value::to_static).collect()),
336
3
            Self::Mappings(value) => Value::Mappings(
337
3
                value
338
3
                    .iter()
339
3
                    .map(|(k, v)| (k.to_static(), v.to_static()))
340
3
                    .collect(),
341
3
            ),
342
        }
343
37
    }
344
}
345

            
346
impl<'a, 'b> PartialEq<Value<'b>> for Value<'a> {
347
    #[inline]
348
    fn eq(&self, other: &Value<'b>) -> bool {
349
80
        match (self, other) {
350
12
            (Self::Bool(l0), Value::Bool(r0)) => l0 == r0,
351
28
            (Self::Integer(l0), Value::Integer(r0)) => l0 == r0,
352
6
            (Self::Float(l0), Value::Float(r0)) => l0 == r0,
353
5
            (Self::Bytes(l0), Value::Bytes(r0)) => l0 == r0,
354
5
            (Self::String(l0), Value::String(r0)) => l0 == r0,
355
            (Self::Bytes(l0), Value::String(r0)) => *l0 == r0.as_bytes(),
356
1
            (Self::String(l0), Value::Bytes(r0)) => l0.as_bytes() == &**r0,
357
5
            (Self::Sequence(l0), Value::Sequence(r0)) => l0 == r0,
358
5
            (Self::Mappings(l0), Value::Mappings(r0)) => l0 == r0,
359
13
            _ => core::mem::discriminant(self) == core::mem::discriminant(other),
360
        }
361
80
    }
362
}
363

            
364
impl<'a> Display for Value<'a> {
365
54
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
366
54
        match self {
367
5
            Value::None => f.write_str("None"),
368
3
            Value::Unit => f.write_str("()"),
369
1
            Value::Bool(true) => f.write_str("true"),
370
1
            Value::Bool(false) => f.write_str("false"),
371
17
            Value::Integer(value) => Display::fmt(value, f),
372
2
            Value::Float(value) => Display::fmt(value, f),
373
2
            Value::Bytes(bytes) => {
374
2
                f.write_str("0x")?;
375
12
                for (index, byte) in bytes.iter().enumerate() {
376
12
                    if index > 0 && index % 4 == 0 {
377
1
                        f.write_char('_')?;
378
11
                    }
379
12
                    write!(f, "{byte:02x}")?;
380
                }
381
2
                Ok(())
382
            }
383
13
            Value::String(string) => f.write_str(string),
384
3
            Value::Sequence(sequence) => {
385
3
                f.write_char('[')?;
386
3
                for (index, value) in sequence.iter().enumerate() {
387
3
                    if index > 0 {
388
1
                        f.write_str(", ")?;
389
2
                    }
390
3
                    Display::fmt(value, f)?;
391
                }
392
3
                f.write_char(']')
393
            }
394
7
            Value::Mappings(mappings) => {
395
7
                f.write_char('{')?;
396
11
                for (index, (key, value)) in mappings.iter().enumerate() {
397
11
                    if index > 0 {
398
5
                        f.write_str(", ")?;
399
6
                    }
400
11
                    Display::fmt(key, f)?;
401
11
                    f.write_str(": ")?;
402
11
                    Display::fmt(value, f)?;
403
                }
404
7
                f.write_char('}')
405
            }
406
        }
407
54
    }
408
}
409

            
410
impl<'a> Serialize for Value<'a> {
411
    #[inline]
412
24
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
413
24
    where
414
24
        S: serde::Serializer,
415
24
    {
416
24
        match self {
417
3
            Value::None => serializer.serialize_none(),
418
2
            Value::Unit => serializer.serialize_unit(),
419
2
            Value::Bool(value) => serializer.serialize_bool(*value),
420
10
            Value::Integer(integer) => match integer.0 {
421
1
                InnerInteger::I8(value) => serializer.serialize_i8(value),
422
1
                InnerInteger::I16(value) => serializer.serialize_i16(value),
423
1
                InnerInteger::I32(value) => serializer.serialize_i32(value),
424
1
                InnerInteger::I64(value) => serializer.serialize_i64(value),
425
1
                InnerInteger::I128(value) => serializer.serialize_i128(value),
426
1
                InnerInteger::U8(value) => serializer.serialize_u8(value),
427
1
                InnerInteger::U16(value) => serializer.serialize_u16(value),
428
1
                InnerInteger::U32(value) => serializer.serialize_u32(value),
429
1
                InnerInteger::U64(value) => serializer.serialize_u64(value),
430
1
                InnerInteger::U128(value) => serializer.serialize_u128(value),
431
            },
432
2
            Value::Float(value) => match value.0 {
433
1
                InnerFloat::F64(value) => serializer.serialize_f64(value),
434
1
                InnerFloat::F32(value) => serializer.serialize_f32(value),
435
            },
436
3
            Value::Bytes(value) => serializer.serialize_bytes(value),
437
            Value::String(value) => serializer.serialize_str(value),
438
1
            Value::Sequence(values) => {
439
1
                let mut seq = serializer.serialize_seq(Some(values.len()))?;
440
2
                for value in values {
441
1
                    seq.serialize_element(value)?;
442
                }
443
1
                seq.end()
444
            }
445
1
            Value::Mappings(keys_and_values) => {
446
1
                let mut map = serializer.serialize_map(Some(keys_and_values.len()))?;
447
2
                for (key, value) in keys_and_values {
448
1
                    map.serialize_entry(key, value)?;
449
                }
450
1
                map.end()
451
            }
452
        }
453
24
    }
454
}
455

            
456
impl<'de: 'a, 'a> Deserialize<'de> for Value<'a> {
457
    #[inline]
458
29
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
459
29
    where
460
29
        D: serde::Deserializer<'de>,
461
29
    {
462
29
        deserializer.deserialize_any(ValueVisitor::default())
463
29
    }
464
}
465

            
466
/// A <code>[Value]&lt;&apos;static&gt;</code> wrapper that supports
467
/// [`DeserializeOwned`](serde::de::DeserializeOwned).
468
///
469
/// Because `Value<'a>` can borrow strings and bytes during deserialization,
470
/// `Value<'static>` can't be used when `DeserializeOwned` is needed.
471
/// [`OwnedValue`] implements [`Deserialize`] by first deserializing a
472
/// `Value<'a>` and then using [`Value::into_static`] to convert borrowed data
473
/// to owned data.
474
1
#[derive(Debug, Clone, PartialEq)]
475
pub struct OwnedValue(pub Value<'static>);
476

            
477
impl Deref for OwnedValue {
478
    type Target = Value<'static>;
479

            
480
    #[inline]
481
2
    fn deref(&self) -> &Self::Target {
482
2
        &self.0
483
2
    }
484
}
485

            
486
impl DerefMut for OwnedValue {
487
    #[inline]
488
1
    fn deref_mut(&mut self) -> &mut Self::Target {
489
1
        &mut self.0
490
1
    }
491
}
492

            
493
impl Serialize for OwnedValue {
494
    #[inline]
495
1
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
496
1
    where
497
1
        S: serde::Serializer,
498
1
    {
499
1
        self.0.serialize(serializer)
500
1
    }
501
}
502

            
503
impl<'de> Deserialize<'de> for OwnedValue {
504
    #[inline]
505
1
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
506
1
    where
507
1
        D: serde::Deserializer<'de>,
508
1
    {
509
1
        deserializer
510
1
            .deserialize_any(ValueVisitor::default())
511
1
            .map(|value| Self(value.into_static()))
512
1
    }
513
}
514

            
515
impl<'a> From<Value<'a>> for OwnedValue {
516
    #[inline]
517
1
    fn from(value: Value<'a>) -> Self {
518
1
        Self(value.into_static())
519
1
    }
520
}
521

            
522
impl<'a> From<&'a Value<'a>> for OwnedValue {
523
    #[inline]
524
1
    fn from(value: &'a Value<'a>) -> Self {
525
1
        Self(value.to_static())
526
1
    }
527
}
528

            
529
30
#[derive(Default)]
530
struct ValueVisitor<'a>(PhantomData<&'a ()>);
531

            
532
impl<'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
3
    fn visit_none<E>(self) -> Result<Self::Value, E>
541
3
    where
542
3
        E: serde::de::Error,
543
3
    {
544
3
        Ok(Value::None)
545
3
    }
546

            
547
    #[inline]
548
2
    fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
549
2
    where
550
2
        E: serde::de::Error,
551
2
    {
552
2
        Ok(Value::Bool(v))
553
2
    }
554

            
555
    #[inline]
556
1
    fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
557
1
    where
558
1
        E: serde::de::Error,
559
1
    {
560
1
        Ok(Value::Integer(Integer::from(v)))
561
1
    }
562

            
563
    #[inline]
564
1
    fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
565
1
    where
566
1
        E: serde::de::Error,
567
1
    {
568
1
        Ok(Value::Integer(Integer::from(v)))
569
1
    }
570

            
571
    #[inline]
572
1
    fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
573
1
    where
574
1
        E: serde::de::Error,
575
1
    {
576
1
        Ok(Value::Integer(Integer::from(v)))
577
1
    }
578

            
579
    #[inline]
580
1
    fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
581
1
    where
582
1
        E: serde::de::Error,
583
1
    {
584
1
        Ok(Value::Integer(Integer::from(v)))
585
1
    }
586

            
587
    #[inline]
588
1
    fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
589
1
    where
590
1
        E: serde::de::Error,
591
1
    {
592
1
        Ok(Value::Integer(Integer::from(v)))
593
1
    }
594

            
595
    #[inline]
596
2
    fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
597
2
    where
598
2
        E: serde::de::Error,
599
2
    {
600
2
        Ok(Value::Integer(Integer::from(v)))
601
2
    }
602

            
603
    #[inline]
604
1
    fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
605
1
    where
606
1
        E: serde::de::Error,
607
1
    {
608
1
        Ok(Value::Integer(Integer::from(v)))
609
1
    }
610

            
611
    #[inline]
612
1
    fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
613
1
    where
614
1
        E: serde::de::Error,
615
1
    {
616
1
        Ok(Value::Integer(Integer::from(v)))
617
1
    }
618

            
619
    #[inline]
620
1
    fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
621
1
    where
622
1
        E: serde::de::Error,
623
1
    {
624
1
        Ok(Value::Integer(Integer::from(v)))
625
1
    }
626

            
627
    #[inline]
628
1
    fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
629
1
    where
630
1
        E: serde::de::Error,
631
1
    {
632
1
        Ok(Value::Integer(Integer::from(v)))
633
1
    }
634

            
635
    #[inline]
636
1
    fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
637
1
    where
638
1
        E: serde::de::Error,
639
1
    {
640
1
        Ok(Value::Float(Float::from(v)))
641
1
    }
642

            
643
    #[inline]
644
1
    fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
645
1
    where
646
1
        E: serde::de::Error,
647
1
    {
648
1
        Ok(Value::Float(Float::from(v)))
649
1
    }
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
5
    fn visit_borrowed_str<E>(self, v: &'a str) -> Result<Self::Value, E>
661
5
    where
662
5
        E: serde::de::Error,
663
5
    {
664
5
        Ok(Value::String(Cow::Borrowed(v)))
665
5
    }
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
1
    fn visit_borrowed_bytes<E>(self, v: &'a [u8]) -> Result<Self::Value, E>
685
1
    where
686
1
        E: serde::de::Error,
687
1
    {
688
1
        Ok(Value::Bytes(Cow::Borrowed(v)))
689
1
    }
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
2
    fn visit_unit<E>(self) -> Result<Self::Value, E>
709
2
    where
710
2
        E: serde::de::Error,
711
2
    {
712
2
        Ok(Value::Unit)
713
2
    }
714

            
715
    #[inline]
716
1
    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
717
1
    where
718
1
        A: serde::de::SeqAccess<'de>,
719
1
    {
720
1
        let mut values = if let Some(hint) = seq.size_hint() {
721
1
            Vec::with_capacity(hint)
722
        } else {
723
            Vec::new()
724
        };
725
2
        while let Some(value) = seq.next_element()? {
726
1
            values.push(value);
727
1
        }
728
1
        Ok(Value::Sequence(values))
729
1
    }
730

            
731
    #[inline]
732
2
    fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
733
2
    where
734
2
        A: serde::de::MapAccess<'de>,
735
2
    {
736
2
        let mut values = if let Some(hint) = map.size_hint() {
737
2
            Vec::with_capacity(hint)
738
        } else {
739
            Vec::new()
740
        };
741
5
        while let Some(value) = map.next_entry()? {
742
3
            values.push(value);
743
3
        }
744
2
        Ok(Value::Mappings(values))
745
2
    }
746
}
747

            
748
impl<'a> From<Option<Value<'a>>> for Value<'a> {
749
    #[inline]
750
    fn from(value: Option<Value<'a>>) -> Self {
751
3
        if let Some(value) = value {
752
1
            value
753
        } else {
754
2
            Value::None
755
        }
756
3
    }
757
}
758

            
759
impl<'a> From<()> for Value<'a> {
760
    #[inline]
761
1
    fn from(_: ()) -> Self {
762
1
        Value::Unit
763
1
    }
764
}
765

            
766
impl<'a> From<bool> for Value<'a> {
767
    #[inline]
768
6
    fn from(value: bool) -> Self {
769
6
        Value::Bool(value)
770
6
    }
771
}
772

            
773
macro_rules! define_value_from_primitive {
774
    ($container:ident, $variant:ident, $primitive:ty) => {
775
        impl<'a> From<$primitive> for Value<'a> {
776
            #[inline]
777
64
            fn from(value: $primitive) -> Self {
778
64
                Self::$container($container::from(value))
779
64
            }
780
        }
781
    };
782
}
783

            
784
define_value_from_primitive!(Integer, U8, u8);
785
define_value_from_primitive!(Integer, U16, u16);
786
define_value_from_primitive!(Integer, U32, u32);
787
define_value_from_primitive!(Integer, U64, u64);
788
define_value_from_primitive!(Integer, U128, u128);
789

            
790
define_value_from_primitive!(Integer, I8, i8);
791
define_value_from_primitive!(Integer, I16, i16);
792
define_value_from_primitive!(Integer, I32, i32);
793
define_value_from_primitive!(Integer, I64, i64);
794
define_value_from_primitive!(Integer, I128, i128);
795

            
796
define_value_from_primitive!(Float, F32, f32);
797
define_value_from_primitive!(Float, F64, f64);
798

            
799
impl<'a> From<&'a [u8]> for Value<'a> {
800
    #[inline]
801
1
    fn from(bytes: &'a [u8]) -> Self {
802
1
        Self::Bytes(Cow::Borrowed(bytes))
803
1
    }
804
}
805

            
806
impl<'a> From<Vec<u8>> for Value<'a> {
807
    #[inline]
808
1
    fn from(bytes: Vec<u8>) -> Self {
809
1
        Self::Bytes(Cow::Owned(bytes))
810
1
    }
811
}
812

            
813
impl<'a, const N: usize> From<&'a [u8; N]> for Value<'a> {
814
    #[inline]
815
4
    fn from(bytes: &'a [u8; N]) -> Self {
816
4
        Self::Bytes(Cow::Borrowed(bytes))
817
4
    }
818
}
819

            
820
impl<'a> From<&'a str> for Value<'a> {
821
    #[inline]
822
4
    fn from(string: &'a str) -> Self {
823
4
        Self::String(Cow::Borrowed(string))
824
4
    }
825
}
826

            
827
impl<'a> From<String> for Value<'a> {
828
    #[inline]
829
1
    fn from(string: String) -> Self {
830
1
        Self::String(Cow::Owned(string))
831
1
    }
832
}
833

            
834
impl<'a> From<Vec<Value<'a>>> for Value<'a> {
835
    #[inline]
836
6
    fn from(value: Vec<Value<'a>>) -> Self {
837
6
        Self::Sequence(value)
838
6
    }
839
}
840

            
841
impl<'a> From<Vec<(Value<'a>, Value<'a>)>> for Value<'a> {
842
    #[inline]
843
6
    fn from(value: Vec<(Value<'a>, Value<'a>)>) -> Self {
844
6
        Self::Mappings(value)
845
6
    }
846
}
847

            
848
impl<'a, A> FromIterator<A> for Value<'a>
849
where
850
    A: Into<Value<'a>>,
851
{
852
    #[inline]
853
6
    fn from_iter<T: IntoIterator<Item = A>>(iter: T) -> Self {
854
6
        Self::from(iter.into_iter().map(A::into).collect::<Vec<_>>())
855
6
    }
856
}
857

            
858
impl<'a, K, V> FromIterator<(K, V)> for Value<'a>
859
where
860
    K: Into<Value<'a>>,
861
    V: Into<Value<'a>>,
862
{
863
    #[inline]
864
6
    fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
865
6
        Self::from(
866
6
            iter.into_iter()
867
8
                .map(|(k, v)| (k.into(), v.into()))
868
6
                .collect::<Vec<_>>(),
869
6
        )
870
6
    }
871
}
872

            
873
/// An iterator over values contained within a [`Value`].
874
pub struct ValueIter<'a>(SequenceIterState<'a>);
875

            
876
enum SequenceIterState<'a> {
877
    Sequence(std::slice::Iter<'a, Value<'a>>),
878
    Mappings(std::slice::Iter<'a, (Value<'a>, Value<'a>)>),
879
}
880

            
881
impl<'a> Iterator for ValueIter<'a> {
882
    type Item = &'a Value<'a>;
883

            
884
    #[inline]
885
7
    fn next(&mut self) -> Option<Self::Item> {
886
7
        match &mut self.0 {
887
4
            SequenceIterState::Sequence(sequence) => sequence.next(),
888
3
            SequenceIterState::Mappings(mappings) => mappings.next().map(|(_k, v)| v),
889
        }
890
7
    }
891
}
892

            
893
impl<'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

            
902
impl<'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
1
#[test]
912
#[allow(clippy::cognitive_complexity)]
913
1
fn value_display_tests() {
914
1
    // Specials
915
1
    assert_eq!(Value::None.to_string(), "None");
916
1
    assert_eq!(Value::Unit.to_string(), "()");
917

            
918
    // Boolean
919
1
    assert_eq!(Value::Bool(false).to_string(), "false");
920
1
    assert_eq!(Value::Bool(true).to_string(), "true");
921

            
922
    // Integer
923
1
    assert_eq!(Value::from(1_u8).to_string(), "1");
924
1
    assert_eq!(Value::from(1_u16).to_string(), "1");
925
1
    assert_eq!(Value::from(1_u32).to_string(), "1");
926
1
    assert_eq!(Value::from(1_u64).to_string(), "1");
927
1
    assert_eq!(Value::from(1_u128).to_string(), "1");
928
1
    assert_eq!(Value::from(1_i8).to_string(), "1");
929
1
    assert_eq!(Value::from(1_i16).to_string(), "1");
930
1
    assert_eq!(Value::from(1_i32).to_string(), "1");
931
1
    assert_eq!(Value::from(1_i64).to_string(), "1");
932
1
    assert_eq!(Value::from(1_i128).to_string(), "1");
933

            
934
    // Float
935
1
    assert_eq!(Value::from(1.1_f32).to_string(), "1.1");
936
1
    assert_eq!(Value::from(1.1_f64).to_string(), "1.1");
937

            
938
    // Bytes
939
1
    assert_eq!(Value::from(b"\xFE\xED\xD0\xD0").to_string(), "0xfeedd0d0");
940
1
    assert_eq!(
941
1
        Value::from(b"\xFE\xED\xD0\xD0\xDE\xAD\xBE\xEF").to_string(),
942
1
        "0xfeedd0d0_deadbeef"
943
1
    );
944

            
945
    // String
946
1
    assert_eq!(Value::from("hello world").to_string(), "hello world");
947

            
948
    // Sequence
949
1
    assert_eq!(
950
1
        Value::from_sequence(Vec::<Value<'_>>::new()).to_string(),
951
1
        "[]"
952
1
    );
953
1
    assert_eq!(
954
1
        Value::from_sequence(vec![Value::None]).to_string(),
955
1
        "[None]"
956
1
    );
957
1
    assert_eq!(
958
1
        Value::from_sequence(vec![Value::None, Value::Unit]).to_string(),
959
1
        "[None, ()]"
960
1
    );
961

            
962
    // Mappings
963
1
    assert_eq!(
964
1
        Value::from_mappings(Vec::<(Value<'_>, Value<'_>)>::new()).to_string(),
965
1
        "{}"
966
1
    );
967
1
    assert_eq!(
968
1
        Value::from_mappings(vec![(Value::from(0_u8), Value::None)]).to_string(),
969
1
        "{0: None}"
970
1
    );
971
1
    assert_eq!(
972
1
        Value::from_mappings(vec![
973
1
            (Value::from(0_u8), Value::None),
974
1
            (Value::from(1_u8), Value::Unit)
975
1
        ])
976
1
        .to_string(),
977
1
        "{0: None, 1: ()}"
978
1
    );
979
1
}
980

            
981
1
#[test]
982
#[allow(clippy::manual_assert)] // approx::assert_relative_eq false positive
983
1
fn value_as_float_tests() {
984
1
    approx::assert_relative_eq!(
985
1
        Value::from(u8::MAX)
986
1
            .as_float()
987
1
            .expect("u8 conversion failed")
988
1
            .as_f32()
989
1
            .expect("f32 conversion failed"),
990
1
        255_f32,
991
1
    );
992
1
    approx::assert_relative_eq!(
993
1
        Value::from(u32::MAX)
994
1
            .as_float()
995
1
            .expect("u32 conversion failed")
996
1
            .as_f64(),
997
1
        4_294_967_295_f64,
998
1
    );
999
1
    assert!(Value::from(u32::MAX)
1
        .as_float()
1
        .expect("u32 conversion failed")
1
        .as_f32()
1
        .is_err());

            
1
    approx::assert_relative_eq!(Value::from(0_f64).as_float().unwrap().as_f32().unwrap(), 0.);
1
}

            
1
#[test]
1
fn value_as_integer_tests() {
1
    macro_rules! test_signed {
1
        ($primitive:ty, $signed_method:ident, $unsigned:ty, $unsigned_method:ident, $float:ty) => {
1
            assert_eq!(
1
                Value::from(<$primitive>::MAX)
1
                    .as_integer()
1
                    .expect("integer conversion failed")
1
                    .$signed_method()
1
                    .unwrap(),
1
                <$primitive>::MAX,
1
            );
1
            assert_eq!(
1
                Value::from(<$primitive>::MIN)
1
                    .as_integer()
1
                    .expect("integer conversion failed")
1
                    .$signed_method()
1
                    .unwrap(),
1
                <$primitive>::MIN,
1
            );
1
            assert_eq!(
1
                Value::from(<$primitive>::MAX)
1
                    .as_integer()
1
                    .expect("integer conversion failed")
1
                    .$unsigned_method()
1
                    .unwrap(),
1
                <$unsigned>::try_from(<$primitive>::MAX).unwrap(),
1
            );
1

            
1
            assert_eq!(
1
                Value::from(<$float>::from(<$primitive>::MAX))
1
                    .as_integer()
1
                    .expect("integer conversion failed")
1
                    .$signed_method()
1
                    .unwrap(),
1
                <$primitive>::MAX,
1
            );
1
            assert_eq!(
1
                Value::from(<$float>::from(<$primitive>::MIN))
1
                    .as_integer()
1
                    .expect("integer conversion failed")
1
                    .$signed_method()
1
                    .unwrap(),
1
                <$primitive>::MIN,
1
            );
1
            assert_eq!(
1
                Value::from(<$float>::from(<$primitive>::MAX))
1
                    .as_integer()
1
                    .expect("integer conversion failed")
1
                    .$unsigned_method()
1
                    .unwrap(),
1
                <$unsigned>::try_from(<$primitive>::MAX).unwrap(),
1
            );
1
        };
1
    }
1

            
1
    test_signed!(i8, as_i8, u8, as_u8, f32);
1
    test_signed!(i16, as_i16, u16, as_u16, f32);
1
    test_signed!(i32, as_i32, u32, as_u32, f64);

            
    macro_rules! test_unsigned {
        ($primitive:ty, $unsigned_method:ident, $signed:ty, $signed_method:ident, $float:ty) => {
            assert_eq!(
                Value::from(<$primitive>::MAX)
                    .as_integer()
                    .expect("integer conversion failed")
                    .$unsigned_method()
                    .unwrap(),
                <$primitive>::MAX,
            );
            assert!(Value::from(<$primitive>::MAX)
                .as_integer()
                .expect("integer conversion failed")
                .$signed_method()
                .is_err());
            assert_eq!(
                Value::from(<$float>::from(<$primitive>::MAX))
                    .as_integer()
                    .expect("integer conversion failed")
                    .$unsigned_method()
                    .unwrap(),
                <$primitive>::MAX,
            );
            assert!(Value::from(<$float>::from(<$primitive>::MAX))
                .as_integer()
                .expect("integer conversion failed")
                .$signed_method()
                .is_err());
        };
    }

            
1
    test_unsigned!(u8, as_u8, i8, as_i8, f32);
1
    test_unsigned!(u16, as_u16, i16, as_i16, f32);
1
    test_unsigned!(u32, as_u32, i32, as_i32, f64);
1
}

            
struct Serializer;

            
impl serde::Serializer for Serializer {
    type Error = ValueError;
    type Ok = Value<'static>;
    type SerializeMap = MappingsSerializer;
    type SerializeSeq = SequenceSerializer;
    type SerializeStruct = MappingsSerializer;
    type SerializeStructVariant = StructVariantSerializer;
    type SerializeTuple = SequenceSerializer;
    type SerializeTupleStruct = SequenceSerializer;
    type SerializeTupleVariant = TupleVariantSerializer;

            
    fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
        Ok(Value::Bool(v))
    }

            
1
    fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Integer(Integer::from(v)))
1
    }

            
1
    fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Integer(Integer::from(v)))
1
    }

            
1
    fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Integer(Integer::from(v)))
1
    }

            
1
    fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Integer(Integer::from(v)))
1
    }

            
1
    fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Integer(Integer::from(v)))
1
    }

            
11
    fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
11
        Ok(Value::Integer(Integer::from(v)))
11
    }

            
1
    fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Integer(Integer::from(v)))
1
    }

            
2
    fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
2
        Ok(Value::Integer(Integer::from(v)))
2
    }

            
5
    fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
5
        Ok(Value::Integer(Integer::from(v)))
5
    }

            
1
    fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Integer(Integer::from(v)))
1
    }

            
1
    fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Float(Float::from(v)))
1
    }

            
1
    fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Float(Float::from(v)))
1
    }

            
1
    fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Integer(Integer::from(u32::from(v))))
1
    }

            
2
    fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
2
        Ok(Value::String(Cow::Owned(v.to_string())))
2
    }

            
    fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
        Ok(Value::Bytes(Cow::Owned(v.to_vec())))
    }

            
    fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
        Ok(Value::None)
    }

            
1
    fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
1
    where
1
        T: Serialize + ?Sized,
1
    {
1
        value.serialize(Self)
1
    }

            
    fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
        Ok(Value::Unit)
    }

            
    fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
        Ok(Value::Unit)
    }

            
1
    fn serialize_unit_variant(
1
        self,
1
        _name: &'static str,
1
        _variant_index: u32,
1
        variant: &'static str,
1
    ) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::String(Cow::Borrowed(variant)))
1
    }

            
    fn serialize_newtype_struct<T>(
        self,
        _name: &'static str,
        value: &T,
    ) -> Result<Self::Ok, Self::Error>
    where
        T: Serialize + ?Sized,
    {
        value.serialize(Self)
    }

            
1
    fn serialize_newtype_variant<T>(
1
        self,
1
        _name: &'static str,
1
        _variant_index: u32,
1
        variant: &'static str,
1
        value: &T,
1
    ) -> Result<Self::Ok, Self::Error>
1
    where
1
        T: Serialize + ?Sized,
1
    {
1
        Ok(Value::Mappings(vec![(
1
            Value::String(Cow::Borrowed(variant)),
1
            value.serialize(Self)?,
        )]))
1
    }

            
1
    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
1
        Ok(SequenceSerializer(
1
            len.map_or_else(Vec::new, Vec::with_capacity),
1
        ))
1
    }

            
1
    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
1
        Ok(SequenceSerializer(Vec::with_capacity(len)))
1
    }

            
    fn serialize_tuple_struct(
        self,
        _name: &'static str,
        len: usize,
    ) -> Result<Self::SerializeTupleStruct, Self::Error> {
        Ok(SequenceSerializer(Vec::with_capacity(len)))
    }

            
1
    fn serialize_tuple_variant(
1
        self,
1
        _name: &'static str,
1
        _variant_index: u32,
1
        variant: &'static str,
1
        len: usize,
1
    ) -> Result<Self::SerializeTupleVariant, Self::Error> {
1
        Ok(TupleVariantSerializer {
1
            variant,
1
            sequence: Vec::with_capacity(len),
1
        })
1
    }

            
    fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
        Ok(MappingsSerializer(
            len.map_or_else(Vec::new, Vec::with_capacity),
        ))
    }

            
1
    fn serialize_struct(
1
        self,
1
        _name: &'static str,
1
        len: usize,
1
    ) -> Result<Self::SerializeStruct, Self::Error> {
1
        Ok(MappingsSerializer(Vec::with_capacity(len)))
1
    }

            
1
    fn serialize_struct_variant(
1
        self,
1
        _name: &'static str,
1
        _variant_index: u32,
1
        variant: &'static str,
1
        len: usize,
1
    ) -> Result<Self::SerializeStructVariant, Self::Error> {
1
        Ok(StructVariantSerializer {
1
            variant,
1
            mappings: Vec::with_capacity(len),
1
        })
1
    }
}

            
struct SequenceSerializer(Vec<Value<'static>>);

            
impl SerializeSeq for SequenceSerializer {
    type Error = ValueError;
    type Ok = Value<'static>;

            
    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
    where
        T: Serialize + ?Sized,
    {
5
        self.0.push(value.serialize(Serializer)?);
5
        Ok(())
5
    }

            
1
    fn end(self) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Sequence(self.0))
1
    }
}

            
impl SerializeTuple for SequenceSerializer {
    type Error = ValueError;
    type Ok = Value<'static>;

            
    fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
    where
        T: Serialize + ?Sized,
    {
5
        self.0.push(value.serialize(Serializer)?);
5
        Ok(())
5
    }

            
1
    fn end(self) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Sequence(self.0))
1
    }
}

            
impl SerializeTupleStruct for SequenceSerializer {
    type Error = ValueError;
    type Ok = Value<'static>;

            
    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
    where
        T: Serialize + ?Sized,
    {
        self.0.push(value.serialize(Serializer)?);
        Ok(())
    }

            
    fn end(self) -> Result<Self::Ok, Self::Error> {
        Ok(Value::Sequence(self.0))
    }
}

            
struct TupleVariantSerializer {
    variant: &'static str,
    sequence: Vec<Value<'static>>,
}

            
impl SerializeTupleVariant for TupleVariantSerializer {
    type Error = ValueError;
    type Ok = Value<'static>;

            
    fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
    where
        T: Serialize + ?Sized,
    {
2
        self.sequence.push(value.serialize(Serializer)?);
2
        Ok(())
2
    }

            
1
    fn end(self) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Mappings(vec![(
1
            Value::String(Cow::Borrowed(self.variant)),
1
            Value::Sequence(self.sequence),
1
        )]))
1
    }
}

            
struct MappingsSerializer(Vec<(Value<'static>, Value<'static>)>);

            
impl SerializeMap for MappingsSerializer {
    type Error = ValueError;
    type Ok = Value<'static>;

            
    fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
    where
        T: Serialize + ?Sized,
    {
        self.0.push((key.serialize(Serializer)?, Value::None));
        Ok(())
    }

            
    fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
    where
        T: Serialize + ?Sized,
    {
        self.0
            .last_mut()
            .expect("serialize_value called without serialize_key")
            .1 = value.serialize(Serializer)?;
        Ok(())
    }

            
    fn end(self) -> Result<Self::Ok, Self::Error> {
        Ok(Value::Mappings(self.0))
    }
}

            
impl SerializeStruct for MappingsSerializer {
    type Error = ValueError;
    type Ok = Value<'static>;

            
    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
    where
        T: Serialize + ?Sized,
    {
        self.0.push((
13
            Value::String(Cow::Borrowed(key)),
13
            value.serialize(Serializer)?,
        ));
13
        Ok(())
13
    }

            
1
    fn end(self) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Mappings(self.0))
1
    }
}

            
struct StructVariantSerializer {
    variant: &'static str,
    mappings: Vec<(Value<'static>, Value<'static>)>,
}

            
impl SerializeStructVariant for StructVariantSerializer {
    type Error = ValueError;
    type Ok = Value<'static>;

            
    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
    where
        T: Serialize + ?Sized,
    {
        self.mappings.push((
1
            Value::String(Cow::Borrowed(key)),
1
            value.serialize(Serializer)?,
        ));
1
        Ok(())
1
    }

            
1
    fn end(self) -> Result<Self::Ok, Self::Error> {
1
        Ok(Value::Mappings(vec![(
1
            Value::String(Cow::Borrowed(self.variant)),
1
            Value::Mappings(self.mappings),
1
        )]))
1
    }
}

            
struct Deserializer<'de>(&'de Value<'de>);

            
impl<'de> serde::Deserializer<'de> for Deserializer<'de> {
    type Error = ValueError;

            
    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
        match &self.0 {
            Value::None => visitor.visit_none(),
            Value::Unit => visitor.visit_unit(),
            Value::Bool(value) => visitor.visit_bool(*value),
            Value::Integer(integer) => match integer.0 {
                InnerInteger::I8(value) => visitor.visit_i8(value),
                InnerInteger::I16(value) => visitor.visit_i16(value),
                InnerInteger::I32(value) => visitor.visit_i32(value),
                InnerInteger::I64(value) => visitor.visit_i64(value),
                InnerInteger::I128(value) => visitor.visit_i128(value),
                InnerInteger::U8(value) => visitor.visit_u8(value),
                InnerInteger::U16(value) => visitor.visit_u16(value),
                InnerInteger::U32(value) => visitor.visit_u32(value),
                InnerInteger::U64(value) => visitor.visit_u64(value),
                InnerInteger::U128(value) => visitor.visit_u128(value),
            },
            Value::Float(float) => match float.0 {
                InnerFloat::F64(value) => visitor.visit_f64(value),
                InnerFloat::F32(value) => visitor.visit_f32(value),
            },
            Value::Bytes(bytes) => visitor.visit_bytes(bytes),
            Value::String(str) => visitor.visit_str(str),
            Value::Sequence(seq) => visitor.visit_seq(SequenceDeserializer(seq)),
            Value::Mappings(mappings) => visitor.visit_map(MappingsDeserializer(mappings)),
        }
    }

            
    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
        if let Value::Bool(value) = &self.0 {
            visitor.visit_bool(*value)
        } else {
            Err(ValueError::Expected {
                kind: "bool",
                value: self.0.to_static(),
            })
        }
    }

            
    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Integer(value) = &self.0 {
1
            if let Ok(value) = value.as_i8() {
1
                return visitor.visit_i8(value);
            }
        }

            
        Err(ValueError::Expected {
            kind: "i8",
            value: self.0.to_static(),
        })
1
    }

            
    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Integer(value) = &self.0 {
1
            if let Ok(value) = value.as_i16() {
1
                return visitor.visit_i16(value);
            }
        }

            
        Err(ValueError::Expected {
            kind: "i16",
            value: self.0.to_static(),
        })
1
    }

            
    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Integer(value) = &self.0 {
1
            if let Ok(value) = value.as_i32() {
1
                return visitor.visit_i32(value);
            }
        }

            
        Err(ValueError::Expected {
            kind: "i32",
            value: self.0.to_static(),
        })
1
    }

            
    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Integer(value) = &self.0 {
1
            if let Ok(value) = value.as_i64() {
1
                return visitor.visit_i64(value);
            }
        }

            
        Err(ValueError::Expected {
            kind: "i64",
            value: self.0.to_static(),
        })
1
    }

            
    fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Integer(value) = &self.0 {
1
            if let Ok(value) = value.as_i128() {
1
                return visitor.visit_i128(value);
            }
        }

            
        Err(ValueError::Expected {
            kind: "i128",
            value: self.0.to_static(),
        })
1
    }

            
    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
11
        if let Value::Integer(value) = &self.0 {
11
            if let Ok(value) = value.as_u8() {
11
                return visitor.visit_u8(value);
            }
        }

            
        Err(ValueError::Expected {
            kind: "u8",
            value: self.0.to_static(),
        })
11
    }

            
    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Integer(value) = &self.0 {
1
            if let Ok(value) = value.as_u16() {
1
                return visitor.visit_u16(value);
            }
        }

            
        Err(ValueError::Expected {
            kind: "u16",
            value: self.0.to_static(),
        })
1
    }

            
    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
2
        if let Value::Integer(value) = &self.0 {
2
            if let Ok(value) = value.as_u32() {
2
                return visitor.visit_u32(value);
            }
        }

            
        Err(ValueError::Expected {
            kind: "u32",
            value: self.0.to_static(),
        })
2
    }

            
    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
5
        if let Value::Integer(value) = &self.0 {
5
            if let Ok(value) = value.as_u64() {
5
                return visitor.visit_u64(value);
            }
        }

            
        Err(ValueError::Expected {
            kind: "u64",
            value: self.0.to_static(),
        })
5
    }

            
    fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Integer(value) = &self.0 {
1
            if let Ok(value) = value.as_u128() {
1
                return visitor.visit_u128(value);
            }
        }

            
        Err(ValueError::Expected {
            kind: "u128",
            value: self.0.to_static(),
        })
1
    }

            
    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Float(value) = &self.0 {
1
            if let Ok(value) = value.as_f32() {
1
                return visitor.visit_f32(value);
            }
        }

            
        Err(ValueError::Expected {
            kind: "f32",
            value: self.0.to_static(),
        })
1
    }

            
    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Float(value) = &self.0 {
1
            visitor.visit_f64(value.as_f64())
        } else {
            Err(ValueError::Expected {
                kind: "f64",
                value: self.0.to_static(),
            })
        }
1
    }

            
    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Integer(value) = &self.0 {
1
            if let Ok(value) = value.as_u32() {
1
                if let Ok(char) = char::try_from(value) {
1
                    return visitor.visit_char(char);
                }
            }
        }

            
        Err(ValueError::Expected {
            kind: "char",
            value: self.0.to_static(),
        })
1
    }

            
    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
18
        if let Value::String(value) = &self.0 {
18
            visitor.visit_borrowed_str(value)
        } else {
            Err(ValueError::Expected {
                kind: "str",
                value: self.0.to_static(),
            })
        }
18
    }

            
    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
2
        if let Value::String(value) = &self.0 {
2
            visitor.visit_borrowed_str(value)
        } else {
            Err(ValueError::Expected {
                kind: "String",
                value: self.0.to_static(),
            })
        }
2
    }

            
    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
        if let Value::Bytes(value) = &self.0 {
            visitor.visit_borrowed_bytes(value)
        } else {
            Err(ValueError::Expected {
                kind: "bytes",
                value: self.0.to_static(),
            })
        }
    }

            
    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
        if let Value::Bytes(value) = &self.0 {
            visitor.visit_borrowed_bytes(value)
        } else {
            Err(ValueError::Expected {
                kind: "byte buf",
                value: self.0.to_static(),
            })
        }
    }

            
1
    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1
    where
1
        V: Visitor<'de>,
1
    {
1
        if matches!(&self.0, Value::None) {
            visitor.visit_none()
        } else {
1
            visitor.visit_some(self)
        }
1
    }

            
    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
        if let Value::Unit = &self.0 {
            visitor.visit_unit()
        } else {
            Err(ValueError::Expected {
                kind: "()",
                value: self.0.to_static(),
            })
        }
    }

            
    fn deserialize_unit_struct<V>(
        self,
        _name: &'static str,
        visitor: V,
    ) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
        if let Value::Unit = &self.0 {
            visitor.visit_unit()
        } else {
            Err(ValueError::Expected {
                kind: "()",
                value: self.0.to_static(),
            })
        }
    }

            
    fn deserialize_newtype_struct<V>(
        self,
        _name: &'static str,
        visitor: V,
    ) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
        visitor.visit_newtype_struct(self)
    }

            
    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
2
        if let Value::Sequence(sequence) = &self.0 {
2
            visitor.visit_seq(SequenceDeserializer(sequence))
        } else {
            Err(ValueError::Expected {
                kind: "sequence",
                value: self.0.to_static(),
            })
        }
2
    }

            
    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
        if let Value::Sequence(sequence) = &self.0 {
            visitor.visit_seq(SequenceDeserializer(sequence))
        } else {
            Err(ValueError::Expected {
                kind: "tuple",
                value: self.0.to_static(),
            })
        }
    }

            
    fn deserialize_tuple_struct<V>(
        self,
        _name: &'static str,
        _len: usize,
        visitor: V,
    ) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
        if let Value::Sequence(sequence) = &self.0 {
            visitor.visit_seq(SequenceDeserializer(sequence))
        } else {
            Err(ValueError::Expected {
                kind: "tuple struct",
                value: self.0.to_static(),
            })
        }
    }

            
    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
        if let Value::Mappings(sequence) = &self.0 {
            visitor.visit_map(MappingsDeserializer(sequence))
        } else {
            Err(ValueError::Expected {
                kind: "map",
                value: self.0.to_static(),
            })
        }
    }

            
    fn deserialize_struct<V>(
        self,
        _name: &'static str,
        _fields: &'static [&'static str],
        visitor: V,
    ) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Mappings(sequence) = &self.0 {
1
            visitor.visit_map(MappingsDeserializer(sequence))
        } else {
            Err(ValueError::Expected {
                kind: "map",
                value: self.0.to_static(),
            })
        }
1
    }

            
4
    fn deserialize_enum<V>(
4
        self,
4
        _name: &'static str,
4
        _variants: &'static [&'static str],
4
        visitor: V,
4
    ) -> Result<V::Value, Self::Error>
4
    where
4
        V: Visitor<'de>,
4
    {
4
        visitor.visit_enum(self)
4
    }

            
18
    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
18
    where
18
        V: Visitor<'de>,
18
    {
18
        self.deserialize_str(visitor)
18
    }

            
    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
        self.deserialize_any(visitor)
    }
}

            
impl<'de> EnumAccess<'de> for Deserializer<'de> {
    type Error = ValueError;
    type Variant = Self;

            
4
    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
4
    where
4
        V: serde::de::DeserializeSeed<'de>,
4
    {
4
        match &self.0 {
3
            Value::Mappings(mapping) => {
3
                if !mapping.is_empty() {
3
                    let variant = seed.deserialize(Deserializer(&mapping[0].0))?;
3
                    return Ok((variant, Deserializer(&mapping[0].1)));
                }
            }
            Value::String(_) => {
1
                let variant = seed.deserialize(Deserializer(self.0))?;
1
                return Ok((variant, Deserializer(&Value::Unit)));
            }
            _ => {}
        }

            
        Err(ValueError::Expected {
            kind: "enum variant",
            value: self.0.to_static(),
        })
4
    }
}

            
impl<'de> VariantAccess<'de> for Deserializer<'de> {
    type Error = ValueError;

            
1
    fn unit_variant(self) -> Result<(), Self::Error> {
1
        if matches!(self.0, Value::Unit) {
1
            Ok(())
        } else {
            Err(ValueError::Expected {
                kind: "unit",
                value: self.0.to_static(),
            })
        }
1
    }

            
1
    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
1
    where
1
        T: serde::de::DeserializeSeed<'de>,
1
    {
1
        seed.deserialize(self)
1
    }

            
    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Sequence(sequence) = &self.0 {
1
            visitor.visit_seq(SequenceDeserializer(sequence))
        } else {
            Err(ValueError::Expected {
                kind: "tuple variant",
                value: self.0.to_static(),
            })
        }
1
    }

            
    fn struct_variant<V>(
        self,
        _fields: &'static [&'static str],
        visitor: V,
    ) -> Result<V::Value, Self::Error>
    where
        V: Visitor<'de>,
    {
1
        if let Value::Mappings(mappings) = &self.0 {
1
            visitor.visit_map(MappingsDeserializer(mappings))
        } else {
            Err(ValueError::Expected {
                kind: "struct variant",
                value: self.0.to_static(),
            })
        }
1
    }
}

            
struct SequenceDeserializer<'de>(&'de [Value<'de>]);

            
impl<'de> SeqAccess<'de> for SequenceDeserializer<'de> {
    type Error = ValueError;

            
14
    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
14
    where
14
        T: serde::de::DeserializeSeed<'de>,
14
    {
14
        if self.0.is_empty() {
2
            Ok(None)
        } else {
12
            let value = seed.deserialize(Deserializer(&self.0[0]))?;
12
            self.0 = &self.0[1..];
12
            Ok(Some(value))
        }
14
    }

            
2
    fn size_hint(&self) -> Option<usize> {
2
        Some(self.0.len())
2
    }
}

            
struct MappingsDeserializer<'de>(&'de [(Value<'de>, Value<'de>)]);

            
impl<'de> MapAccess<'de> for MappingsDeserializer<'de> {
    type Error = ValueError;

            
16
    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Self::Error>
16
    where
16
        K: serde::de::DeserializeSeed<'de>,
16
    {
16
        if self.0.is_empty() {
2
            Ok(None)
        } else {
14
            let key = seed.deserialize(Deserializer(&self.0[0].0))?;
14
            Ok(Some(key))
        }
16
    }

            
14
    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
14
    where
14
        V: serde::de::DeserializeSeed<'de>,
14
    {
14
        let value = seed.deserialize(Deserializer(&self.0[0].1))?;
14
        self.0 = &self.0[1..];
14
        Ok(value)
14
    }

            
    fn size_hint(&self) -> Option<usize> {
        Some(self.0.len())
    }
}

            
/// An error from deserializing a type using [`Value::deserialize_as`].
1
#[derive(Debug, PartialEq)]
pub enum ValueError {
    /// A kind of data was expected, but the [`Value`] cannot be interpreted as
    /// that kind.
    Expected {
        /// The kind of data expected.
        kind: &'static str,
        /// The value that was encountered.
        value: Value<'static>,
    },
    /// A custom deserialization error. These errors originate outside of Pot.
    Custom(String),
}

            
impl std::error::Error for ValueError {}

            
impl Display for ValueError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            ValueError::Expected { kind, value } => write!(f, "expected {kind} but got {value}"),
            ValueError::Custom(msg) => f.write_str(msg),
        }
    }
}

            
impl serde::de::Error for ValueError {
    fn custom<T>(msg: T) -> Self
    where
        T: Display,
    {
        Self::Custom(msg.to_string())
    }
}

            
impl serde::ser::Error for ValueError {
1
    fn custom<T>(msg: T) -> Self
1
    where
1
        T: Display,
1
    {
1
        Self::Custom(msg.to_string())
1
    }
}

            
1
#[test]
1
fn is_empty() {
5
    for expected_empty in [
1
        Value::None,
1
        Value::Bytes(Cow::Borrowed(b"")),
1
        Value::String(Cow::Borrowed("")),
1
        Value::Sequence(vec![]),
1
        Value::Mappings(vec![]),
    ] {
5
        assert!(expected_empty.is_empty(), "{expected_empty} was not empty");
    }
8
    for expected_not_empty in [
1
        Value::Unit,
1
        Value::Bool(true),
1
        Value::Integer(Integer::from(0)),
1
        Value::Float(Float::from(0f32)),
1
        Value::Bytes(Cow::Borrowed(b"a")),
1
        Value::String(Cow::Borrowed("a")),
1
        Value::Sequence(vec![Value::None]),
1
        Value::Mappings(vec![(Value::None, Value::None)]),
    ] {
8
        assert!(
8
            !expected_not_empty.is_empty(),
            "{expected_not_empty} was empty"
        );
    }
1
}

            
1
#[test]
1
fn as_bool() {
8
    for expected_true in [
1
        Value::Unit,
1
        Value::Bool(true),
1
        Value::Integer(Integer::from(1)),
1
        Value::Float(Float::from(1f32)),
1
        Value::Bytes(Cow::Borrowed(b"a")),
1
        Value::String(Cow::Borrowed("a")),
1
        Value::Sequence(vec![Value::None]),
1
        Value::Mappings(vec![(Value::None, Value::None)]),
    ] {
8
        assert!(expected_true.as_bool(), "{expected_true} was false");
    }
8
    for expected_false in [
1
        Value::None,
1
        Value::Bool(false),
1
        Value::Integer(Integer::from(0)),
1
        Value::Float(Float::from(0f32)),
1
        Value::Bytes(Cow::Borrowed(b"")),
1
        Value::String(Cow::Borrowed("")),
1
        Value::Sequence(vec![]),
1
        Value::Mappings(vec![]),
    ] {
8
        assert!(!expected_false.as_bool(), "{expected_false} was true");
    }
1
}

            
1
#[test]
1
fn as_integer() {
1
    assert_eq!(
1
        Value::from(1_i32).as_integer().unwrap().as_i32().unwrap(),
1
        1
1
    );
1
    assert_eq!(
1
        Value::from(1_f32).as_integer().unwrap().as_i32().unwrap(),
1
        1
1
    );
1
    assert_eq!(Value::from(true).as_integer(), None);
1
}

            
1
#[test]
1
fn as_float() {
1
    approx::assert_abs_diff_eq!(
1
        Value::from(1_i32).as_float().unwrap().as_f32().unwrap(),
1
        1_f32
1
    );

            
1
    approx::assert_abs_diff_eq!(
1
        Value::from(1_f32).as_float().unwrap().as_f32().unwrap(),
1
        1_f32
1
    );
1
    assert_eq!(Value::from(true).as_float(), None);
1
}

            
1
#[test]
1
fn as_str() {
1
    assert_eq!(Value::from("asdf").as_str(), Some("asdf"));
1
    assert_eq!(Value::from(b"asdf").as_str(), Some("asdf"));
1
    assert_eq!(Value::from(false).as_str(), None);
1
}

            
1
#[test]
1
fn as_bytes() {
1
    assert_eq!(Value::from(b"asdf").as_bytes(), Some(&b"asdf"[..]));
1
    assert_eq!(Value::from("asdf").as_bytes(), Some(&b"asdf"[..]));
1
    assert_eq!(Value::from(false).as_bytes(), None);
1
}

            
1
#[test]
1
fn values() {
1
    assert_eq!(
1
        Value::from_sequence([Value::Bool(true), Value::Bool(false)])
1
            .values()
1
            .collect::<Vec<_>>(),
1
        &[&Value::Bool(true), &Value::Bool(false)]
1
    );
1
    assert_eq!(
1
        Value::from_mappings([(0, Value::Bool(true)), (1, Value::Bool(false))])
1
            .values()
1
            .collect::<Vec<_>>(),
1
        &[&Value::Bool(true), &Value::Bool(false)]
1
    );
1
    assert_eq!(Value::from(None).values().count(), 0);
1
}

            
1
#[test]
1
fn mappings() {
1
    assert_eq!(
1
        Value::from_sequence([Value::Bool(true), Value::Bool(false)])
1
            .mappings()
1
            .cloned()
1
            .collect::<Vec<_>>(),
1
        &[]
1
    );
1
    assert_eq!(
1
        Value::from_mappings([(0, Value::Bool(true)), (1, Value::Bool(false))])
1
            .mappings()
1
            .collect::<Vec<_>>(),
1
        &[
1
            &(Value::from(0), Value::Bool(true)),
1
            &(Value::from(1), Value::Bool(false))
1
        ]
1
    );
1
    assert!(Value::from(false).mappings().collect::<Vec<_>>().is_empty());
1
}

            
1
#[test]
1
fn into_static() {
9
    for borrowed in [
1
        Value::from(None),
1
        Value::from(Some(Value::from(()))),
1
        Value::from(true),
1
        Value::from(1_i32),
1
        Value::from(1_f32),
1
        Value::from(&b"hi"[..]),
1
        Value::from("hi"),
1
        Value::from_sequence([1]),
1
        Value::from_mappings([(1, 2)]),
    ] {
9
        let cloned = borrowed.clone();
9
        let s = borrowed.to_static();
9
        assert_eq!(borrowed.to_static(), borrowed);
        // The first pass had borrowed strings/bytes. The static version has
        // owned values, so these invocations take a slightly different path.
9
        assert_eq!(borrowed, s.to_static());

            
9
        assert_eq!(borrowed.into_static(), cloned);
9
        assert_eq!(cloned, s.into_static());
    }
1
}

            
1
#[test]
1
fn owned_deref() {
1
    let mut owned_value = OwnedValue::from(&Value::from("hello".to_string()));
1
    assert_eq!(owned_value.as_str(), Some("hello"));
1
    let Value::String(Cow::Owned(str)) = &mut *owned_value else {
        unreachable!()
    };
1
    str.push_str(", world");
1
    assert_eq!(owned_value.as_str(), Some("hello, world"));
1
}

            
1
#[test]
1
fn owned_serialization() {
1
    let owned_value = OwnedValue::from(Value::from(b"asdf".to_vec()));
1
    let serialized = crate::to_vec(&owned_value).unwrap();
1
    let deserialized_owned: OwnedValue = crate::from_slice(&serialized).unwrap();
1
    assert_eq!(deserialized_owned, owned_value);
1
}