serde_brief/value/
mod.rs

1//! Generic value that can contain any value in our data format.
2#![cfg_attr(
3	feature = "tracing",
4	allow(clippy::used_underscore_binding, reason = "Only used in tracing::instrument")
5)]
6
7mod de;
8mod ser;
9
10use ::alloc::{
11	borrow::{Cow, ToOwned},
12	boxed::Box,
13	collections::VecDeque,
14	string::String,
15	vec::Vec,
16};
17use ::core::{
18	fmt::Write,
19	marker::PhantomData,
20	ops::{Deref, DerefMut},
21};
22use ::serde::{Deserialize, Serialize};
23
24use crate::{Config, Result};
25
26/// Serialize a type to the generic [Value] type using the given configuration.
27#[cfg_attr(feature = "tracing", ::tracing::instrument(skip(value)))]
28pub fn to_value_with_config<T>(value: &T, config: Config) -> Result<Value<'static>>
29where
30	T: Serialize,
31{
32	let ser = ser::ValueSerializer::new(config.use_indices);
33	value.serialize(ser)
34}
35
36/// Serialize a type to the generic [Value] type.
37pub fn to_value<T>(value: &T) -> Result<Value<'static>>
38where
39	T: Serialize,
40{
41	to_value_with_config(value, Config::default())
42}
43
44/// Deserialize a type from a generic [Value] using the given configuration.
45#[cfg_attr(feature = "tracing", ::tracing::instrument(skip(value)))]
46pub fn from_value_with_config<'de, T>(value: Value<'de>, _config: Config) -> Result<T>
47where
48	T: Deserialize<'de>,
49{
50	let de = de::ValueDeserializer::new(value);
51	T::deserialize(de)
52}
53
54/// Deserialize a type from a generic [Value].
55pub fn from_value<'de, T>(value: Value<'de>) -> Result<T>
56where
57	T: Deserialize<'de>,
58{
59	from_value_with_config(value, Config::default())
60}
61
62/// Generic value that can contain any value in our data format. It can be deserialized and
63/// serialized to be exactly as when serializing or deserializing with the given type.
64///
65/// Note: [Clone]ing this value will not borrow from owned values. For that, you need to call
66/// [Value::borrow_clone].
67#[derive(Debug, Clone, Default)]
68pub enum Value<'a> {
69	/// Null / None / Unit type.
70	#[default]
71	Null,
72	/// Bool value.
73	Bool(bool),
74	/// Integer value.
75	Integer(Integer),
76	/// Float value.
77	Float(Float),
78	/// Bytes value.
79	Bytes(Cow<'a, [u8]>),
80	/// String value.
81	String(Cow<'a, str>),
82	/// Sequence value.
83	Array(VecDeque<Self>),
84	/// Map value (ordered).
85	Map(VecDeque<(Self, Self)>),
86}
87
88/// Wrapper for an owned value, i.e. `Value<'static>`.
89#[derive(Debug, Clone, Default)]
90pub struct OwnedValue(Value<'static>);
91
92/// The unsigned/signed integer value.
93#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
94pub enum Integer {
95	/// Unsigned integer.
96	Unsigned(u128),
97	/// Signed integer.
98	Signed(i128),
99}
100
101/// The float value with any precision.
102#[derive(Debug, Clone, Copy, PartialEq)]
103pub enum Float {
104	/// 32-bit float.
105	F32(f32),
106	/// 64-bit float.
107	F64(f64),
108}
109
110impl<'a> Value<'a> {
111	/// Clone this value, borrowing the owned data where possible.
112	pub fn borrow_clone(&self) -> Value<'_> {
113		match self {
114			Value::Null => Value::Null,
115			Value::Bool(b) => Value::Bool(*b),
116			Value::Integer(int) => Value::Integer(*int),
117			Value::Float(float) => Value::Float(*float),
118			Value::Bytes(bytes) => Value::Bytes(Cow::Borrowed(bytes)),
119			Value::String(s) => Value::String(Cow::Borrowed(s)),
120			Value::Array(arr) => Value::Array(arr.iter().map(Self::borrow_clone).collect()),
121			Value::Map(map) => Value::Map(
122				map.iter().map(|(key, value)| (key.borrow_clone(), value.borrow_clone())).collect(),
123			),
124		}
125	}
126
127	/// Make value `'static` by cloning all borrowed data.
128	#[must_use]
129	pub fn into_owned(self) -> OwnedValue {
130		let value = match self {
131			Value::Null => Value::Null,
132			Value::Bool(b) => Value::Bool(b),
133			Value::Integer(int) => Value::Integer(int),
134			Value::Float(float) => Value::Float(float),
135			Value::Bytes(bytes) => Value::Bytes(bytes.into_owned().into()),
136			Value::String(s) => Value::String(s.into_owned().into()),
137			Value::Array(arr) => Value::Array(arr.into_iter().map(|v| v.into_owned().0).collect()),
138			Value::Map(map) => Value::Map(
139				map.into_iter()
140					.map(|(key, value)| (key.into_owned().0, value.into_owned().0))
141					.collect(),
142			),
143		};
144		OwnedValue(value)
145	}
146
147	/// Use this generic [Value] to deserialize into the given concrete type.
148	#[inline]
149	pub fn deserialize_as<'de, T>(self) -> Result<T>
150	where
151		'a: 'de,
152		T: Deserialize<'de>,
153	{
154		T::deserialize(de::ValueDeserializer::new(self))
155	}
156
157	/// Return whether the value is empty. This is the case if:
158	/// - The value is [Value::Null].
159	/// - The value is [Value::Bytes] or [Value::String] of length 0.
160	/// - The value is [Value::Array] or [Value::Map] without items.
161	#[must_use]
162	#[inline]
163	pub fn is_empty(&self) -> bool {
164		match self {
165			Value::Null => true,
166			Value::Bool(_) | Value::Integer(_) | Value::Float(_) => false,
167			Value::Bytes(bytes) => bytes.is_empty(),
168			Value::String(s) => s.is_empty(),
169			Value::Array(arr) => arr.is_empty(),
170			Value::Map(map) => map.is_empty(),
171		}
172	}
173
174	/// Return the inner bool if this is a [Value::Bool].
175	#[must_use]
176	pub const fn as_bool(&self) -> Option<bool> {
177		if let Value::Bool(v) = self {
178			Some(*v)
179		} else {
180			None
181		}
182	}
183
184	/// Return the inner int if this is a [Value::Integer].
185	#[must_use]
186	pub const fn as_int(&self) -> Option<Integer> {
187		if let Value::Integer(v) = self {
188			Some(*v)
189		} else {
190			None
191		}
192	}
193
194	/// Return the inner float if this is a [Value::Float].
195	#[must_use]
196	pub const fn as_float(&self) -> Option<Float> {
197		if let Value::Float(v) = self {
198			Some(*v)
199		} else {
200			None
201		}
202	}
203
204	/// Return the inner bytes if this is a [Value::Bytes].
205	#[must_use]
206	pub fn as_bytes(&self) -> Option<&[u8]> {
207		if let Value::Bytes(v) = self {
208			Some(v)
209		} else {
210			None
211		}
212	}
213
214	/// Return the inner string if this is a [Value::String].
215	#[must_use]
216	pub fn as_string(&self) -> Option<&str> {
217		if let Value::String(v) = self {
218			Some(v)
219		} else {
220			None
221		}
222	}
223
224	/// Return the inner array if this is a [Value::Array].
225	#[must_use]
226	pub const fn as_array(&self) -> Option<&VecDeque<Value<'a>>> {
227		if let Value::Array(v) = self {
228			Some(v)
229		} else {
230			None
231		}
232	}
233
234	/// Return the inner map if this is a [Value::Map].
235	#[must_use]
236	pub const fn as_map(&self) -> Option<&VecDeque<(Value<'a>, Value<'a>)>> {
237		if let Value::Map(v) = self {
238			Some(v)
239		} else {
240			None
241		}
242	}
243
244	/// Iterate over the inner values if this is a [Value::Array] or [Value::Map].
245	#[must_use]
246	pub fn into_values(self) -> Iter<Value<'static>> {
247		match self.into_owned().0 {
248			Value::Array(arr) => Iter::new(arr.into_iter()),
249			Value::Map(map) => Iter::new(map.into_iter().map(|(_key, value)| value)),
250			_ => Iter::new([].into_iter()),
251		}
252	}
253}
254
255impl OwnedValue {
256	/// Create a new owned value.
257	#[must_use]
258	pub fn new(value: Value<'_>) -> Self {
259		value.into_owned()
260	}
261
262	/// Return the inner value.
263	#[must_use]
264	pub fn into_inner(self) -> Value<'static> {
265		self.0
266	}
267}
268
269impl Deref for OwnedValue {
270	type Target = Value<'static>;
271
272	fn deref(&self) -> &Self::Target {
273		&self.0
274	}
275}
276
277impl DerefMut for OwnedValue {
278	fn deref_mut(&mut self) -> &mut Self::Target {
279		&mut self.0
280	}
281}
282
283impl<'a> ::core::fmt::Display for Value<'a> {
284	fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
285		match self {
286			Value::Null => f.write_str("null"),
287			Value::Bool(b) if *b => f.write_str("true"),
288			Value::Bool(_) => f.write_str("false"),
289			Value::Integer(int) => ::core::fmt::Display::fmt(int, f),
290			Value::Float(float) => ::core::fmt::Display::fmt(float, f),
291			Value::Bytes(bytes) => {
292				f.write_str("0x")?;
293				for (i, byte) in bytes.iter().enumerate() {
294					if i > 0 && i % 4 == 0 {
295						f.write_char('_')?;
296					}
297					write!(f, "{byte:02X}")?;
298				}
299				Ok(())
300			}
301			Value::String(s) => f.write_str(s),
302			Value::Array(arr) => {
303				f.write_char('[')?;
304				for (i, value) in arr.iter().enumerate() {
305					if i > 0 {
306						f.write_str(", ")?;
307					}
308					::core::fmt::Display::fmt(value, f)?;
309				}
310				f.write_char(']')
311			}
312			Value::Map(map) => {
313				f.write_char('{')?;
314				for (i, (key, value)) in map.iter().enumerate() {
315					if i > 0 {
316						f.write_str(", ")?;
317					}
318					::core::fmt::Display::fmt(key, f)?;
319					f.write_str(": ")?;
320					::core::fmt::Display::fmt(value, f)?;
321				}
322				f.write_char('}')
323			}
324		}
325	}
326}
327
328impl ::core::fmt::Display for Integer {
329	fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
330		match self {
331			Integer::Unsigned(int) => ::core::fmt::Display::fmt(int, f),
332			Integer::Signed(int) => ::core::fmt::Display::fmt(int, f),
333		}
334	}
335}
336
337impl ::core::fmt::Display for Float {
338	fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
339		match self {
340			Float::F32(float) => ::core::fmt::Display::fmt(float, f),
341			Float::F64(float) => ::core::fmt::Display::fmt(float, f),
342		}
343	}
344}
345
346impl<'a> Serialize for Value<'a> {
347	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
348	where
349		S: ::serde::Serializer,
350	{
351		match self {
352			Value::Null => serializer.serialize_none(),
353			Value::Bool(b) => serializer.serialize_bool(*b),
354			Value::Integer(Integer::Unsigned(int)) => serializer.serialize_u128(*int),
355			Value::Integer(Integer::Signed(int)) => serializer.serialize_i128(*int),
356			Value::Float(Float::F32(float)) => serializer.serialize_f32(*float),
357			Value::Float(Float::F64(float)) => serializer.serialize_f64(*float),
358			Value::Bytes(bytes) => serializer.serialize_bytes(bytes),
359			Value::String(s) => serializer.serialize_str(s),
360			Value::Array(arr) => {
361				use ::serde::ser::SerializeSeq;
362
363				let mut ser = serializer.serialize_seq(Some(arr.len()))?;
364				for value in arr {
365					ser.serialize_element(value)?;
366				}
367				ser.end()
368			}
369			Value::Map(map) => {
370				use ::serde::ser::SerializeMap;
371
372				let mut ser = serializer.serialize_map(Some(map.len()))?;
373				for (key, value) in map {
374					ser.serialize_entry(key, value)?;
375				}
376				ser.end()
377			}
378		}
379	}
380}
381
382impl<'de> Deserialize<'de> for Value<'de> {
383	#[inline]
384	fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
385	where
386		D: serde::Deserializer<'de>,
387	{
388		deserializer.deserialize_any(ValueVisitor::default())
389	}
390}
391
392impl<'de> Deserialize<'de> for OwnedValue {
393	#[inline]
394	fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
395	where
396		D: serde::Deserializer<'de>,
397	{
398		deserializer.deserialize_any(ValueVisitor::default()).map(Value::into_owned)
399	}
400}
401
402/// Serde [Visitor] for deserializing a [Value].
403#[derive(Debug, Clone, Copy, Default)]
404struct ValueVisitor<'a>(PhantomData<Value<'a>>);
405
406impl<'de> ::serde::de::Visitor<'de> for ValueVisitor<'de> {
407	type Value = Value<'de>;
408
409	#[inline]
410	fn expecting(&self, formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
411		formatter.write_str("any value")
412	}
413
414	#[inline]
415	fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
416	where
417		E: serde::de::Error,
418	{
419		Ok(Value::Bool(v))
420	}
421
422	#[inline]
423	fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
424	where
425		E: serde::de::Error,
426	{
427		self.visit_i128(i128::from(v))
428	}
429
430	#[inline]
431	fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
432	where
433		E: serde::de::Error,
434	{
435		Ok(Value::Integer(Integer::Signed(v)))
436	}
437
438	#[inline]
439	fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
440	where
441		E: serde::de::Error,
442	{
443		self.visit_u128(u128::from(v))
444	}
445
446	#[inline]
447	fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
448	where
449		E: serde::de::Error,
450	{
451		Ok(Value::Integer(Integer::Unsigned(v)))
452	}
453
454	#[inline]
455	fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
456	where
457		E: serde::de::Error,
458	{
459		Ok(Value::Float(Float::F32(v)))
460	}
461
462	#[inline]
463	fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
464	where
465		E: serde::de::Error,
466	{
467		Ok(Value::Float(Float::F64(v)))
468	}
469
470	#[inline]
471	fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
472	where
473		E: serde::de::Error,
474	{
475		Ok(Value::String(Cow::Owned(v.to_owned())))
476	}
477
478	#[inline]
479	fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
480	where
481		E: serde::de::Error,
482	{
483		Ok(Value::String(Cow::Borrowed(v)))
484	}
485
486	#[inline]
487	fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
488	where
489		E: serde::de::Error,
490	{
491		Ok(Value::String(Cow::Owned(v)))
492	}
493
494	#[inline]
495	fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
496	where
497		E: serde::de::Error,
498	{
499		Ok(Value::Bytes(Cow::Owned(v.to_vec())))
500	}
501
502	#[inline]
503	fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
504	where
505		E: serde::de::Error,
506	{
507		Ok(Value::Bytes(Cow::Borrowed(v)))
508	}
509
510	#[inline]
511	fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
512	where
513		E: serde::de::Error,
514	{
515		Ok(Value::Bytes(Cow::Owned(v)))
516	}
517
518	#[inline]
519	fn visit_none<E>(self) -> Result<Self::Value, E>
520	where
521		E: serde::de::Error,
522	{
523		Ok(Value::Null)
524	}
525
526	#[inline]
527	fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
528	where
529		D: serde::Deserializer<'de>,
530	{
531		deserializer.deserialize_any(self)
532	}
533
534	#[inline]
535	fn visit_unit<E>(self) -> Result<Self::Value, E>
536	where
537		E: serde::de::Error,
538	{
539		Ok(Value::Null)
540	}
541
542	#[inline]
543	fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
544	where
545		A: serde::de::SeqAccess<'de>,
546	{
547		let mut arr = seq.size_hint().map_or_else(VecDeque::new, VecDeque::with_capacity);
548
549		while let Some(value) = seq.next_element()? {
550			arr.push_back(value);
551		}
552
553		Ok(Value::Array(arr))
554	}
555
556	#[inline]
557	fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
558	where
559		A: serde::de::MapAccess<'de>,
560	{
561		let mut entries = map.size_hint().map_or_else(VecDeque::new, VecDeque::with_capacity);
562
563		while let Some((key, value)) = map.next_entry()? {
564			entries.push_back((key, value));
565		}
566
567		Ok(Value::Map(entries))
568	}
569}
570
571impl<'a> PartialEq for Value<'a> {
572	fn eq(&self, other: &Self) -> bool {
573		match (self, other) {
574			(Self::Null, Self::Null) => true,
575			(Self::Bool(l0), Self::Bool(r0)) => l0 == r0,
576			(Self::Integer(l0), Self::Integer(r0)) => l0 == r0,
577			(Self::Float(l0), Self::Float(r0)) => l0 == r0,
578			(Self::Bytes(l0), Self::Bytes(r0)) => l0 == r0,
579			(Self::String(l0), Self::String(r0)) => l0 == r0,
580			(Self::Array(l0), Self::Array(r0)) => l0 == r0,
581			(Self::Map(l0), Self::Map(r0)) => l0 == r0,
582			_ => false,
583		}
584	}
585}
586
587impl<'a> PartialEq<bool> for Value<'a> {
588	fn eq(&self, other: &bool) -> bool {
589		match self {
590			Value::Bool(b) => b == other,
591			_ => false,
592		}
593	}
594}
595
596impl<'a> PartialEq<u128> for Value<'a> {
597	fn eq(&self, other: &u128) -> bool {
598		match self {
599			Value::Integer(Integer::Unsigned(int)) => int == other,
600			_ => false,
601		}
602	}
603}
604
605impl<'a> PartialEq<i128> for Value<'a> {
606	fn eq(&self, other: &i128) -> bool {
607		match self {
608			Value::Integer(Integer::Signed(int)) => int == other,
609			_ => false,
610		}
611	}
612}
613
614impl<'a> PartialEq<f32> for Value<'a> {
615	fn eq(&self, other: &f32) -> bool {
616		match self {
617			Value::Float(Float::F32(float)) => float == other,
618			Value::Float(Float::F64(float)) => *float == f64::from(*other),
619			_ => false,
620		}
621	}
622}
623
624impl<'a> PartialEq<f64> for Value<'a> {
625	fn eq(&self, other: &f64) -> bool {
626		match self {
627			Value::Float(Float::F32(float)) => f64::from(*float) == *other,
628			Value::Float(Float::F64(float)) => float == other,
629			_ => false,
630		}
631	}
632}
633
634impl<'a> PartialEq<[u8]> for Value<'a> {
635	fn eq(&self, other: &[u8]) -> bool {
636		match self {
637			Value::Bytes(bytes) => bytes.as_ref() == other,
638			_ => false,
639		}
640	}
641}
642
643impl<'a> PartialEq<str> for Value<'a> {
644	fn eq(&self, other: &str) -> bool {
645		match self {
646			Value::String(s) => s == other,
647			_ => false,
648		}
649	}
650}
651
652impl<'a> From<Option<Value<'a>>> for Value<'a> {
653	#[inline]
654	fn from(value: Option<Value<'a>>) -> Self {
655		value.unwrap_or_else(|| Value::Null)
656	}
657}
658
659impl<'a> From<()> for Value<'a> {
660	#[inline]
661	fn from(_: ()) -> Self {
662		Value::Null
663	}
664}
665
666impl<'a> From<bool> for Value<'a> {
667	#[inline]
668	fn from(value: bool) -> Self {
669		Value::Bool(value)
670	}
671}
672
673impl<'a> From<u8> for Value<'a> {
674	#[inline]
675	fn from(value: u8) -> Self {
676		Value::Integer(Integer::Unsigned(u128::from(value)))
677	}
678}
679
680impl<'a> From<i8> for Value<'a> {
681	#[inline]
682	fn from(value: i8) -> Self {
683		Value::Integer(Integer::Signed(i128::from(value)))
684	}
685}
686
687impl<'a> From<u16> for Value<'a> {
688	#[inline]
689	fn from(value: u16) -> Self {
690		Value::Integer(Integer::Unsigned(u128::from(value)))
691	}
692}
693
694impl<'a> From<i16> for Value<'a> {
695	#[inline]
696	fn from(value: i16) -> Self {
697		Value::Integer(Integer::Signed(i128::from(value)))
698	}
699}
700
701impl<'a> From<u32> for Value<'a> {
702	#[inline]
703	fn from(value: u32) -> Self {
704		Value::Integer(Integer::Unsigned(u128::from(value)))
705	}
706}
707
708impl<'a> From<i32> for Value<'a> {
709	#[inline]
710	fn from(value: i32) -> Self {
711		Value::Integer(Integer::Signed(i128::from(value)))
712	}
713}
714
715impl<'a> From<u64> for Value<'a> {
716	#[inline]
717	fn from(value: u64) -> Self {
718		Value::Integer(Integer::Unsigned(u128::from(value)))
719	}
720}
721
722impl<'a> From<i64> for Value<'a> {
723	#[inline]
724	fn from(value: i64) -> Self {
725		Value::Integer(Integer::Signed(i128::from(value)))
726	}
727}
728
729impl<'a> From<usize> for Value<'a> {
730	#[inline]
731	fn from(value: usize) -> Self {
732		Value::Integer(Integer::Unsigned(value as u128))
733	}
734}
735
736impl<'a> From<isize> for Value<'a> {
737	#[inline]
738	fn from(value: isize) -> Self {
739		Value::Integer(Integer::Signed(value as i128))
740	}
741}
742
743impl<'a> From<u128> for Value<'a> {
744	#[inline]
745	fn from(value: u128) -> Self {
746		Value::Integer(Integer::Unsigned(value))
747	}
748}
749
750impl<'a> From<i128> for Value<'a> {
751	#[inline]
752	fn from(value: i128) -> Self {
753		Value::Integer(Integer::Signed(value))
754	}
755}
756
757impl<'a> From<f32> for Value<'a> {
758	#[inline]
759	fn from(value: f32) -> Self {
760		Value::Float(Float::F32(value))
761	}
762}
763
764impl<'a> From<f64> for Value<'a> {
765	#[inline]
766	fn from(value: f64) -> Self {
767		Value::Float(Float::F64(value))
768	}
769}
770
771impl<'a> From<&'a [u8]> for Value<'a> {
772	#[inline]
773	fn from(value: &'a [u8]) -> Self {
774		Value::Bytes(Cow::Borrowed(value))
775	}
776}
777
778impl<'a> From<Vec<u8>> for Value<'a> {
779	#[inline]
780	fn from(value: Vec<u8>) -> Self {
781		Value::Bytes(Cow::Owned(value))
782	}
783}
784
785impl<'a> From<Cow<'a, [u8]>> for Value<'a> {
786	#[inline]
787	fn from(value: Cow<'a, [u8]>) -> Self {
788		Value::Bytes(value)
789	}
790}
791
792impl<'a> From<&'a str> for Value<'a> {
793	#[inline]
794	fn from(value: &'a str) -> Self {
795		Value::String(Cow::Borrowed(value))
796	}
797}
798
799impl<'a> From<String> for Value<'a> {
800	#[inline]
801	fn from(value: String) -> Self {
802		Value::String(Cow::Owned(value))
803	}
804}
805
806impl<'a> From<Cow<'a, str>> for Value<'a> {
807	#[inline]
808	fn from(value: Cow<'a, str>) -> Self {
809		Value::String(value)
810	}
811}
812
813impl<'a> From<VecDeque<Value<'a>>> for Value<'a> {
814	#[inline]
815	fn from(value: VecDeque<Value<'a>>) -> Self {
816		Value::Array(value)
817	}
818}
819
820impl<'a> From<VecDeque<(Value<'a>, Value<'a>)>> for Value<'a> {
821	#[inline]
822	fn from(value: VecDeque<(Value<'a>, Value<'a>)>) -> Self {
823		Value::Map(value)
824	}
825}
826
827impl<'a, T> FromIterator<T> for Value<'a>
828where
829	T: Into<Value<'a>>,
830{
831	#[inline]
832	fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
833		Self::from(iter.into_iter().map(Into::into).collect::<VecDeque<_>>())
834	}
835}
836
837impl<'a, K, V> FromIterator<(K, V)> for Value<'a>
838where
839	K: Into<Value<'a>>,
840	V: Into<Value<'a>>,
841{
842	#[inline]
843	fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self {
844		Self::from(iter.into_iter().map(|(k, v)| (k.into(), v.into())).collect::<VecDeque<_>>())
845	}
846}
847
848/// Trait for trait objects of exact size iterators.
849trait AllIteratorTrait<Item>:
850	Iterator<Item = Item> + ExactSizeIterator + DoubleEndedIterator + ::core::fmt::Debug
851{
852}
853impl<I, T> AllIteratorTrait<T> for I where
854	I: Iterator<Item = T> + ExactSizeIterator + DoubleEndedIterator + ::core::fmt::Debug
855{
856}
857
858/// Generic iterator.
859#[derive(Debug)]
860pub struct Iter<T>(Box<dyn AllIteratorTrait<T> + Send + Sync>);
861
862impl<T> Iter<T> {
863	/// Create a new generic iterator.
864	fn new<I>(iter: I) -> Self
865	where
866		I: AllIteratorTrait<T> + Send + Sync + 'static,
867	{
868		Self(Box::new(iter))
869	}
870}
871
872impl<T> Iterator for Iter<T> {
873	type Item = T;
874
875	fn next(&mut self) -> Option<Self::Item> {
876		self.0.next()
877	}
878
879	fn size_hint(&self) -> (usize, Option<usize>) {
880		self.0.size_hint()
881	}
882
883	fn count(self) -> usize
884	where
885		Self: Sized,
886	{
887		self.0.count()
888	}
889
890	fn last(self) -> Option<Self::Item>
891	where
892		Self: Sized,
893	{
894		self.0.last()
895	}
896
897	fn nth(&mut self, n: usize) -> Option<Self::Item> {
898		self.0.nth(n)
899	}
900}
901
902impl<T> ExactSizeIterator for Iter<T> {
903	fn len(&self) -> usize {
904		self.0.len()
905	}
906}
907
908impl<T> DoubleEndedIterator for Iter<T> {
909	fn next_back(&mut self) -> Option<Self::Item> {
910		self.0.next_back()
911	}
912
913	fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
914		self.0.nth_back(n)
915	}
916}
917
918
919#[cfg(test)]
920mod tests;