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