tinc/private/
deserializer.rs1use 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}