1
use super::registry::get_repr_by_name;
2
use super::stored::{ReprRuleStored, ReprStateStored};
3
use super::types::ReprRule;
4
use serde::de::{MapAccess, Visitor};
5
use serde::ser::SerializeMap;
6
use serde::{Deserialize, Deserializer, Serialize, Serializer};
7
use std::collections::HashMap;
8
use std::fmt;
9
use std::fmt::Debug;
10

            
11
pub struct ReprStore {
12
    inner: HashMap<&'static str, Box<dyn ReprStateStored>>,
13
}
14

            
15
impl Debug for ReprStore {
16
8787
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
17
8787
        write!(f, "ReprStore")
18
8787
    }
19
}
20

            
21
impl Clone for ReprStore {
22
68007199
    fn clone(&self) -> Self {
23
        Self {
24
68007199
            inner: self
25
68007199
                .inner
26
68007199
                .iter()
27
58
                .map(|(&k, v)| (k, v.clone_box()))
28
                .collect(),
29
        }
30
68007199
    }
31
}
32

            
33
impl PartialEq for ReprStore {
34
    fn eq(&self, other: &Self) -> bool {
35
        self.inner
36
            .keys()
37
            .zip(other.inner.keys())
38
            .all(|(k1, k2)| k1 == k2)
39
    }
40
}
41

            
42
impl Eq for ReprStore {}
43

            
44
impl Default for ReprStore {
45
    fn default() -> Self {
46
        Self::new()
47
    }
48
}
49

            
50
impl ReprStore {
51
722822697
    pub fn new() -> Self {
52
722822697
        Self {
53
722822697
            inner: HashMap::new(),
54
722822697
        }
55
722822697
    }
56

            
57
4244386
    pub fn has<T: ReprRule + ?Sized>(&self) -> bool {
58
4244386
        self.get::<T>().is_some()
59
4244386
    }
60

            
61
    pub fn pretty(&self) {
62
        eprintln!("{:#?}", self.inner);
63
    }
64

            
65
11468087
    pub fn get<T: ReprRule + ?Sized>(&self) -> Option<&T::DeclLevel> {
66
11468087
        self.inner
67
11468087
            .get(T::NAME)
68
9692492
            .and_then(|x| x.as_any().downcast_ref())
69
11468087
    }
70

            
71
    pub fn get_mut<T: ReprRule + ?Sized>(&mut self) -> Option<&mut T::DeclLevel> {
72
        self.inner
73
            .get_mut(T::NAME)
74
            .and_then(|x| x.as_any_mut().downcast_mut())
75
    }
76

            
77
26364539
    pub fn get_by_rule(&self, rule: &dyn ReprRuleStored) -> Option<&dyn ReprStateStored> {
78
26364539
        self.inner.get(rule.name()).map(AsRef::as_ref)
79
26364539
    }
80

            
81
6546578
    pub fn has_repr(&self, rule: &dyn ReprRuleStored) -> bool {
82
6546578
        self.get_by_rule(rule).is_some()
83
6546578
    }
84

            
85
3217998
    pub fn put<T: ReprRule + ?Sized>(&mut self, value: T::DeclLevel) {
86
3217998
        self.inner.insert(T::NAME, Box::new(value));
87
3217998
    }
88

            
89
986681487
    pub fn iter(&self) -> impl Iterator<Item = (&'static str, &dyn ReprStateStored)> {
90
986681487
        self.inner.iter().map(|(k, v)| (*k, v.as_ref()))
91
986681487
    }
92

            
93
    pub fn len(&self) -> usize {
94
        self.inner.len()
95
    }
96

            
97
8271198972
    pub fn is_empty(&self) -> bool {
98
8271198972
        self.inner.is_empty()
99
8271198972
    }
100
}
101

            
102
impl Serialize for ReprStore {
103
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
104
    where
105
        S: Serializer,
106
    {
107
        let mut map = serializer.serialize_map(Some(self.inner.len()))?;
108
        for (&name, state) in &self.inner {
109
            let value = state.serialise().map_err(serde::ser::Error::custom)?;
110
            map.serialize_entry(name, &value)?;
111
        }
112
        map.end()
113
    }
114
}
115

            
116
impl<'de> Deserialize<'de> for ReprStore {
117
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
118
    where
119
        D: Deserializer<'de>,
120
    {
121
        struct ReprStoreVisitor;
122

            
123
        impl<'de> Visitor<'de> for ReprStoreVisitor {
124
            type Value = ReprStore;
125

            
126
            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
127
                formatter.write_str("a map of repr rule names to their serialized states")
128
            }
129

            
130
            fn visit_map<M>(self, mut access: M) -> Result<ReprStore, M::Error>
131
            where
132
                M: MapAccess<'de>,
133
            {
134
                let mut inner = HashMap::new();
135

            
136
                while let Some((key, value)) = access.next_entry::<String, serde_json::Value>()? {
137
                    let repr = get_repr_by_name(&key).ok_or_else(|| {
138
                        serde::de::Error::custom(format!(
139
                            "unknown repr rule '{}'; was it registered?",
140
                            key
141
                        ))
142
                    })?;
143
                    let state = repr
144
                        .deserialize_state(value)
145
                        .map_err(serde::de::Error::custom)?;
146
                    inner.insert(repr.name(), state);
147
                }
148

            
149
                Ok(ReprStore { inner })
150
            }
151
        }
152

            
153
        deserializer.deserialize_map(ReprStoreVisitor)
154
    }
155
}