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