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, end: Option, value: Option, } impl<'de, T> SpannedDeserializer<'de, T> where T: serde::de::IntoDeserializer<'de, Error>, { pub(crate) fn new(value: T, span: std::ops::Range) -> 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(&mut self, seed: K) -> Result, 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(&mut self, seed: V) -> Result 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") } } }