1 use crate::de::Error; 2 3 pub(crate) struct ArrayDeserializer { 4 input: Vec<crate::Item>, 5 span: Option<std::ops::Range<usize>>, 6 } 7 8 impl ArrayDeserializer { new(input: Vec<crate::Item>, span: Option<std::ops::Range<usize>>) -> Self9 pub(crate) fn new(input: Vec<crate::Item>, span: Option<std::ops::Range<usize>>) -> Self { 10 Self { input, span } 11 } 12 } 13 14 // Note: this is wrapped by `ValueDeserializer` and any trait methods 15 // implemented here need to be wrapped there 16 impl<'de> serde::Deserializer<'de> for ArrayDeserializer { 17 type Error = Error; 18 deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: serde::de::Visitor<'de>,19 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> 20 where 21 V: serde::de::Visitor<'de>, 22 { 23 visitor.visit_seq(ArraySeqAccess::new(self.input)) 24 } 25 deserialize_struct<V>( self, name: &'static str, fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: serde::de::Visitor<'de>,26 fn deserialize_struct<V>( 27 self, 28 name: &'static str, 29 fields: &'static [&'static str], 30 visitor: V, 31 ) -> Result<V::Value, Error> 32 where 33 V: serde::de::Visitor<'de>, 34 { 35 if serde_spanned::__unstable::is_spanned(name, fields) { 36 if let Some(span) = self.span.clone() { 37 return visitor.visit_map(super::SpannedDeserializer::new(self, span)); 38 } 39 } 40 41 self.deserialize_any(visitor) 42 } 43 44 serde::forward_to_deserialize_any! { 45 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq 46 bytes byte_buf map option unit newtype_struct 47 ignored_any unit_struct tuple_struct tuple enum identifier 48 } 49 } 50 51 impl<'de> serde::de::IntoDeserializer<'de, crate::de::Error> for ArrayDeserializer { 52 type Deserializer = Self; 53 into_deserializer(self) -> Self::Deserializer54 fn into_deserializer(self) -> Self::Deserializer { 55 self 56 } 57 } 58 59 impl crate::Array { into_deserializer(self) -> ArrayDeserializer60 pub(crate) fn into_deserializer(self) -> ArrayDeserializer { 61 ArrayDeserializer::new(self.values, self.span) 62 } 63 } 64 65 impl crate::ArrayOfTables { into_deserializer(self) -> ArrayDeserializer66 pub(crate) fn into_deserializer(self) -> ArrayDeserializer { 67 ArrayDeserializer::new(self.values, self.span) 68 } 69 } 70 71 pub(crate) struct ArraySeqAccess { 72 iter: std::vec::IntoIter<crate::Item>, 73 } 74 75 impl ArraySeqAccess { new(input: Vec<crate::Item>) -> Self76 pub(crate) fn new(input: Vec<crate::Item>) -> Self { 77 Self { 78 iter: input.into_iter(), 79 } 80 } 81 } 82 83 impl<'de> serde::de::SeqAccess<'de> for ArraySeqAccess { 84 type Error = Error; 85 next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> where T: serde::de::DeserializeSeed<'de>,86 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error> 87 where 88 T: serde::de::DeserializeSeed<'de>, 89 { 90 match self.iter.next() { 91 Some(v) => seed 92 .deserialize(crate::de::ValueDeserializer::new(v)) 93 .map(Some), 94 None => Ok(None), 95 } 96 } 97 } 98