1 use serde::de::value::BorrowedStrDeserializer; 2 use serde::de::IntoDeserializer as _; 3 4 use super::Error; 5 6 pub(crate) struct SpannedDeserializer<'de, T: serde::de::IntoDeserializer<'de, Error>> { 7 phantom_data: std::marker::PhantomData<&'de ()>, 8 start: Option<usize>, 9 end: Option<usize>, 10 value: Option<T>, 11 } 12 13 impl<'de, T> SpannedDeserializer<'de, T> 14 where 15 T: serde::de::IntoDeserializer<'de, Error>, 16 { new(value: T, span: std::ops::Range<usize>) -> Self17 pub(crate) fn new(value: T, span: std::ops::Range<usize>) -> Self { 18 Self { 19 phantom_data: Default::default(), 20 start: Some(span.start), 21 end: Some(span.end), 22 value: Some(value), 23 } 24 } 25 } 26 27 impl<'de, T> serde::de::MapAccess<'de> for SpannedDeserializer<'de, T> 28 where 29 T: serde::de::IntoDeserializer<'de, Error>, 30 { 31 type Error = Error; next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> where K: serde::de::DeserializeSeed<'de>,32 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> 33 where 34 K: serde::de::DeserializeSeed<'de>, 35 { 36 if self.start.is_some() { 37 seed.deserialize(BorrowedStrDeserializer::new( 38 serde_spanned::__unstable::START_FIELD, 39 )) 40 .map(Some) 41 } else if self.end.is_some() { 42 seed.deserialize(BorrowedStrDeserializer::new( 43 serde_spanned::__unstable::END_FIELD, 44 )) 45 .map(Some) 46 } else if self.value.is_some() { 47 seed.deserialize(BorrowedStrDeserializer::new( 48 serde_spanned::__unstable::VALUE_FIELD, 49 )) 50 .map(Some) 51 } else { 52 Ok(None) 53 } 54 } 55 next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error> where V: serde::de::DeserializeSeed<'de>,56 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error> 57 where 58 V: serde::de::DeserializeSeed<'de>, 59 { 60 if let Some(start) = self.start.take() { 61 seed.deserialize(start.into_deserializer()) 62 } else if let Some(end) = self.end.take() { 63 seed.deserialize(end.into_deserializer()) 64 } else if let Some(value) = self.value.take() { 65 seed.deserialize(value.into_deserializer()) 66 } else { 67 panic!("next_value_seed called before next_key_seed") 68 } 69 } 70 } 71