serde_spanned/
de.rs

1//! Deserialzation support for [`Spanned`]
2
3use serde::de::value::BorrowedStrDeserializer;
4use serde::de::IntoDeserializer as _;
5
6use crate::Spanned;
7
8/// Check if deserializing a [`Spanned`]
9pub fn is_spanned(name: &'static str) -> bool {
10    crate::spanned::is_spanned(name)
11}
12
13/// Deserializer / format support for emitting [`Spanned`]
14pub 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    /// Create a deserializer to emit [`Spanned`]
32    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}