core_json_traits/
sequences.rs1#[cfg(feature = "alloc")]
2use alloc::{vec, vec::Vec};
3
4use crate::{BytesLike, Stack, JsonError, Value, JsonDeserialize, JsonStructure, JsonSerialize};
5
6impl<T: 'static + Default + JsonDeserialize, const N: usize> JsonDeserialize for [T; N] {
7 fn deserialize<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack>(
8 value: Value<'bytes, 'parent, B, S>,
9 ) -> Result<Self, JsonError<'bytes, B, S>> {
10 let mut res: Self = core::array::from_fn(|_| Default::default());
11 let mut iter = value.iterate()?;
12 let mut i = 0;
13 while let Some(item) = iter.next() {
14 if i == N {
15 Err(JsonError::TypeError)?;
16 }
17 res[i] = T::deserialize(item?)?;
18 i += 1;
19 }
20 if i != N {
21 Err(JsonError::TypeError)?;
22 }
23 Ok(res)
24 }
25}
26impl<T: 'static + Default + JsonDeserialize, const N: usize> JsonStructure for [T; N] {}
27
28#[cfg(feature = "alloc")]
29impl<T: 'static + JsonDeserialize> JsonDeserialize for Vec<T> {
30 fn deserialize<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack>(
31 value: Value<'bytes, 'parent, B, S>,
32 ) -> Result<Self, JsonError<'bytes, B, S>> {
33 let mut res = vec![];
34 let mut iter = value.iterate()?;
35 while let Some(item) = iter.next() {
36 res.push(T::deserialize(item?)?);
37 }
38 Ok(res)
39 }
40}
41#[cfg(feature = "alloc")]
42impl<T: 'static + JsonDeserialize> JsonStructure for Vec<T> {}
43
44impl<T: JsonSerialize> JsonSerialize for [T] {
45 fn serialize(&self) -> impl Iterator<Item = char> {
46 core::iter::once('[')
47 .chain(self.iter().enumerate().flat_map(|(i, elem)| {
48 let last_item = (i + 1) == self.len();
49 elem.serialize().chain((!last_item).then(|| core::iter::once(',')).into_iter().flatten())
50 }))
51 .chain(core::iter::once(']'))
52 }
53}
54impl<T: JsonSerialize, const N: usize> JsonSerialize for [T; N] {
55 fn serialize(&self) -> impl Iterator<Item = char> {
56 self.as_slice().serialize()
57 }
58}
59
60#[cfg(feature = "alloc")]
61impl<T: JsonSerialize> JsonSerialize for Vec<T> {
62 fn serialize(&self) -> impl Iterator<Item = char> {
63 self.as_slice().serialize()
64 }
65}