1use super::{DeserializeContent, Expected};
2
3pub trait Tracker {
4 type Target: Expected;
5
6 fn allow_duplicates(&self) -> bool;
7}
8
9pub trait TrackerFor {
10 type Tracker: Tracker;
11}
12
13pub trait TrackerWrapper: Tracker {
14 type Tracker: Tracker;
15}
16
17pub trait TrackerDeserializer<'de>: Tracker + Sized {
18 fn deserialize<D>(&mut self, value: &mut Self::Target, deserializer: D) -> Result<(), D::Error>
19 where
20 D: DeserializeContent<'de>;
21}
22
23impl<'de, T> TrackerDeserializer<'de> for Box<T>
24where
25 T: TrackerDeserializer<'de>,
26{
27 fn deserialize<D>(&mut self, value: &mut Self::Target, deserializer: D) -> Result<(), D::Error>
28 where
29 D: DeserializeContent<'de>,
30 {
31 self.as_mut().deserialize(value, deserializer)
32 }
33}
34
35impl<T: Tracker> Tracker for Box<T> {
36 type Target = Box<T::Target>;
37
38 fn allow_duplicates(&self) -> bool {
39 self.as_ref().allow_duplicates()
40 }
41}
42
43impl<T: TrackerFor> TrackerFor for Box<T> {
44 type Tracker = Box<T::Tracker>;
45}
46
47impl<T: TrackerWrapper> TrackerWrapper for Box<T> {
48 type Tracker = T::Tracker;
49}