tinc/private/
deserializer.rs

1use std::marker::PhantomData;
2
3use super::Tracker;
4
5pub trait DeserializeContent<'de>: Sized {
6    type Error: serde::de::Error;
7
8    fn deserialize<T>(self) -> Result<T, Self::Error>
9    where
10        T: serde::de::Deserialize<'de>,
11    {
12        self.deserialize_seed(PhantomData)
13    }
14
15    fn deserialize_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
16    where
17        T: serde::de::DeserializeSeed<'de>;
18}
19
20pub(crate) struct MapAccessValueDeserializer<'a, T> {
21    pub map: &'a mut T,
22    pub deserialized: &'a mut bool,
23}
24
25impl<'de, M> DeserializeContent<'de> for MapAccessValueDeserializer<'_, M>
26where
27    M: serde::de::MapAccess<'de>,
28{
29    type Error = M::Error;
30
31    fn deserialize_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
32    where
33        T: serde::de::DeserializeSeed<'de>,
34    {
35        if *self.deserialized {
36            return Err(serde::de::Error::custom("invalid state: field already deserialized"));
37        }
38
39        *self.deserialized = true;
40        self.map.next_value_seed(seed)
41    }
42}
43
44pub(crate) struct SerdeDeserializer<D> {
45    pub deserializer: D,
46}
47
48impl<'de, D> DeserializeContent<'de> for SerdeDeserializer<D>
49where
50    D: serde::Deserializer<'de>,
51{
52    type Error = D::Error;
53
54    fn deserialize_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
55    where
56        T: serde::de::DeserializeSeed<'de>,
57    {
58        seed.deserialize(self.deserializer)
59    }
60}
61
62pub(crate) struct DeserializeHelper<'a, T: Tracker> {
63    pub value: &'a mut T::Target,
64    pub tracker: &'a mut T,
65}
66
67impl<'de, T: Tracker> serde::de::DeserializeSeed<'de> for DeserializeHelper<'_, Box<T>>
68where
69    for<'a> DeserializeHelper<'a, T>: serde::de::DeserializeSeed<'de, Value = ()>,
70{
71    type Value = ();
72
73    fn deserialize<D>(self, de: D) -> Result<Self::Value, D::Error>
74    where
75        D: serde::Deserializer<'de>,
76    {
77        DeserializeHelper {
78            value: self.value.as_mut(),
79            tracker: self.tracker.as_mut(),
80        }
81        .deserialize(de)
82    }
83}