|  | use serde::de::value::BorrowedStrDeserializer; | 
|  | use serde::de::IntoDeserializer as _; | 
|  |  | 
|  | use super::Error; | 
|  |  | 
|  | pub(crate) struct SpannedDeserializer<'de, T: serde::de::IntoDeserializer<'de, Error>> { | 
|  | phantom_data: std::marker::PhantomData<&'de ()>, | 
|  | start: Option<usize>, | 
|  | end: Option<usize>, | 
|  | value: Option<T>, | 
|  | } | 
|  |  | 
|  | impl<'de, T> SpannedDeserializer<'de, T> | 
|  | where | 
|  | T: serde::de::IntoDeserializer<'de, Error>, | 
|  | { | 
|  | pub(crate) fn new(value: T, span: std::ops::Range<usize>) -> Self { | 
|  | Self { | 
|  | phantom_data: Default::default(), | 
|  | start: Some(span.start), | 
|  | end: Some(span.end), | 
|  | value: Some(value), | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | impl<'de, T> serde::de::MapAccess<'de> for SpannedDeserializer<'de, T> | 
|  | where | 
|  | T: serde::de::IntoDeserializer<'de, Error>, | 
|  | { | 
|  | type Error = Error; | 
|  | fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> | 
|  | where | 
|  | K: serde::de::DeserializeSeed<'de>, | 
|  | { | 
|  | if self.start.is_some() { | 
|  | seed.deserialize(BorrowedStrDeserializer::new( | 
|  | serde_spanned::__unstable::START_FIELD, | 
|  | )) | 
|  | .map(Some) | 
|  | } else if self.end.is_some() { | 
|  | seed.deserialize(BorrowedStrDeserializer::new( | 
|  | serde_spanned::__unstable::END_FIELD, | 
|  | )) | 
|  | .map(Some) | 
|  | } else if self.value.is_some() { | 
|  | seed.deserialize(BorrowedStrDeserializer::new( | 
|  | serde_spanned::__unstable::VALUE_FIELD, | 
|  | )) | 
|  | .map(Some) | 
|  | } else { | 
|  | Ok(None) | 
|  | } | 
|  | } | 
|  |  | 
|  | fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error> | 
|  | where | 
|  | V: serde::de::DeserializeSeed<'de>, | 
|  | { | 
|  | if let Some(start) = self.start.take() { | 
|  | seed.deserialize(start.into_deserializer()) | 
|  | } else if let Some(end) = self.end.take() { | 
|  | seed.deserialize(end.into_deserializer()) | 
|  | } else if let Some(value) = self.value.take() { | 
|  | seed.deserialize(value.into_deserializer()) | 
|  | } else { | 
|  | panic!("next_value_seed called before next_key_seed") | 
|  | } | 
|  | } | 
|  | } |