serde_deserialize_over/support/
array.rs

1use crate::{DeserializeOver, DeserializeOverWrapper};
2use serde::{
3  de::{SeqAccess, Visitor},
4  Deserializer,
5};
6use std::fmt;
7
8struct ArrayVisitor<'a, T, const N: usize>(&'a mut [T; N]);
9
10impl<'de, 'a, T, const N: usize> Visitor<'de> for ArrayVisitor<'a, T, N>
11where
12  T: DeserializeOver<'de>,
13{
14  type Value = ();
15
16  fn expecting(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
17    fmt.write_fmt(format_args!("an array of length {}", N))
18  }
19
20  fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
21  where
22    A: SeqAccess<'de>,
23  {
24    for item in self.0.iter_mut() {
25      if let None = seq.next_element_seed(DeserializeOverWrapper(item))? {
26        break;
27      }
28    }
29
30    Ok(())
31  }
32}
33
34impl<'de, T, const N: usize> DeserializeOver<'de> for [T; N]
35where
36  T: DeserializeOver<'de>,
37{
38  fn deserialize_over<D>(&mut self, de: D) -> Result<(), D::Error>
39  where
40    D: Deserializer<'de>,
41  {
42    de.deserialize_tuple(self.len(), ArrayVisitor(self))
43  }
44}