tinc/private/
primitive.rs

1use std::marker::PhantomData;
2
3use super::{DeserializeContent, DeserializeHelper, Expected, Tracker, TrackerDeserializer, TrackerFor};
4
5pub struct PrimitiveTracker<T>(PhantomData<T>);
6
7impl<T> std::fmt::Debug for PrimitiveTracker<T> {
8    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9        write!(f, "PrimitiveTracker<{}>", std::any::type_name::<T>())
10    }
11}
12
13impl<T> Default for PrimitiveTracker<T> {
14    fn default() -> Self {
15        Self(PhantomData)
16    }
17}
18
19impl<'de, T> serde::de::DeserializeSeed<'de> for DeserializeHelper<'_, PrimitiveTracker<T>>
20where
21    T: serde::Deserialize<'de>,
22    PrimitiveTracker<T>: Tracker<Target = T>,
23{
24    type Value = ();
25
26    fn deserialize<D>(self, de: D) -> Result<Self::Value, D::Error>
27    where
28        D: serde::Deserializer<'de>,
29    {
30        *self.value = serde::Deserialize::deserialize(de)?;
31        Ok(())
32    }
33}
34
35impl<T: Default + Expected> Tracker for PrimitiveTracker<T> {
36    type Target = T;
37
38    #[inline(always)]
39    fn allow_duplicates(&self) -> bool {
40        false
41    }
42}
43
44macro_rules! impl_tracker_for_primitive {
45    ($($ty:ty),*) => {
46        $(
47            impl TrackerFor for $ty {
48                type Tracker = PrimitiveTracker<$ty>;
49            }
50
51            impl Expected for $ty {
52                fn expecting(formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
53                    write!(formatter, stringify!($ty))
54                }
55            }
56        )*
57    };
58}
59
60impl_tracker_for_primitive!(String, bool, u32, u64, i32, i64, f32, f64);
61
62impl<'de, T> TrackerDeserializer<'de> for PrimitiveTracker<T>
63where
64    T: serde::Deserialize<'de>,
65    PrimitiveTracker<T>: Tracker<Target = T>,
66{
67    fn deserialize<D>(&mut self, value: &mut Self::Target, deserializer: D) -> Result<(), D::Error>
68    where
69        D: DeserializeContent<'de>,
70    {
71        deserializer.deserialize_seed(DeserializeHelper { value, tracker: self })
72    }
73}