1use std::collections::HashSet;
2use std::fmt;
3
4use serde::de::{self, Visitor};
5use serde::{
6 de::{Error as _, Deserializer},
7 Deserialize,
8};
9
10use super::ast::{Rhs, Lhs, Stars};
11
12#[derive(Debug, PartialEq, Eq, Clone)]
13pub enum InfallibleLhs {
14 DollarSign(usize, usize),
15 At(usize, Box<Rhs>),
16 Square(String),
17}
18
19#[derive(Debug, Clone, PartialEq, Eq, Default)]
20pub struct Object {
21 pub infallible: Vec<(InfallibleLhs, Vec<Rhs>)>,
22 pub literal: Vec<(String, REntry)>,
23 pub amp: Vec<((usize, usize), REntry)>,
24 pub pipes: Vec<(Vec<Stars>, REntry)>,
25}
26
27#[derive(Debug, Clone, PartialEq, Eq)]
28pub enum REntry {
29 Obj(Box<Object>),
30 Rhs(Vec<Rhs>),
31 Thrash,
32}
33
34struct RhsVisitor;
35
36impl<'de> Visitor<'de> for RhsVisitor {
37 type Value = Rhs;
38
39 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
40 formatter.write_str("right hand side expression")
41 }
42
43 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
44 where
45 E: de::Error,
46 {
47 self.visit_str(&v)
48 }
49
50 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
51 where
52 E: de::Error,
53 {
54 Rhs::parse(value).map_err(|e| E::custom(format!("failed to parse: {value}.error={e}")))
55 }
56}
57
58impl<'de> Deserialize<'de> for Rhs {
59 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
60 where
61 D: Deserializer<'de>,
62 {
63 deserializer.deserialize_any(RhsVisitor)
64 }
65}
66
67struct RhssVisitor;
68
69impl<'de> Visitor<'de> for RhssVisitor {
70 type Value = Vec<Rhs>;
71
72 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
73 formatter.write_str("Right hand side expression or a array of rhs expressions")
74 }
75
76 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
77 where
78 E: de::Error,
79 {
80 self.visit_str(&v)
81 }
82
83 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
84 where
85 E: de::Error,
86 {
87 let r = Rhs::parse(value)
88 .map_err(|e| E::custom(format!("failed to parse: {value}.error={e}")))?;
89 Ok(vec![r])
90 }
91
92 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
93 where
94 A: de::SeqAccess<'de>,
95 {
96 let mut arr = Vec::new();
97 while let Some(rhs) = seq.next_element::<Rhss>()? {
98 arr.extend_from_slice(&rhs.0);
99 }
100 Ok(arr)
101 }
102}
103
104struct Rhss(Vec<Rhs>);
105
106impl<'de> Deserialize<'de> for Rhss {
107 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
108 where
109 D: Deserializer<'de>,
110 {
111 deserializer.deserialize_any(RhssVisitor).map(Rhss)
112 }
113}
114
115struct ObjectVisitor;
116
117impl<'de> Visitor<'de> for ObjectVisitor {
118 type Value = Object;
119
120 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
121 formatter.write_str("map")
122 }
123
124 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
125 where
126 A: de::MapAccess<'de>,
127 A::Error: de::Error,
128 {
129 let mut obj = Object::default();
130
131 let mut key_set = HashSet::new();
132
133 while let Some(lhs_s) = map.next_key::<String>()? {
134 let lhs = LhsVisitor.visit_str(&lhs_s)?;
135
136 if !key_set.insert(lhs_s) {
137 return Err(A::Error::custom("duplicate lhs"));
138 }
139
140 match lhs {
141 Lhs::DollarSign(idx0, idx1) => {
142 obj.infallible.push((
143 InfallibleLhs::DollarSign(idx0, idx1),
144 map.next_value::<Rhss>()?.0,
145 ));
146 }
147 Lhs::Amp(idx0, idx1) => {
148 obj.amp.push(((idx0, idx1), map.next_value()?));
149 }
150 Lhs::At(idx, rhs) => {
151 obj.infallible
152 .push((InfallibleLhs::At(idx, rhs), map.next_value::<Rhss>()?.0));
153 }
154 Lhs::Square(lit) => {
155 obj.infallible
156 .push((InfallibleLhs::Square(lit), map.next_value::<Rhss>()?.0));
157 }
158 Lhs::Pipes(pipes) => {
159 obj.pipes.push((pipes, map.next_value()?));
160 }
161 Lhs::Literal(lit) => {
162 obj.literal.push((lit, map.next_value()?));
163 }
164 }
165 }
166
167 Ok(obj)
168 }
169}
170
171impl<'de> Deserialize<'de> for Object {
172 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
173 where
174 D: Deserializer<'de>,
175 {
176 deserializer.deserialize_map(ObjectVisitor)
177 }
178}
179
180struct LhsVisitor;
181
182impl<'de> Visitor<'de> for LhsVisitor {
183 type Value = Lhs;
184
185 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
186 formatter.write_str("Left hand side expression")
187 }
188
189 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
190 where
191 E: de::Error,
192 {
193 self.visit_str(&v)
194 }
195
196 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
197 where
198 E: de::Error,
199 {
200 Lhs::parse(value).map_err(|e| E::custom(format!("failed to parse: {value}.error={e}")))
201 }
202}
203
204impl<'de> Deserialize<'de> for Lhs {
205 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
206 where
207 D: Deserializer<'de>,
208 {
209 deserializer.deserialize_any(LhsVisitor)
210 }
211}
212
213struct REntryVisitor;
214
215impl<'de> Visitor<'de> for REntryVisitor {
216 type Value = REntry;
217
218 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
219 formatter.write_str("Right hand side object or expression")
220 }
221
222 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
223 where
224 E: de::Error,
225 {
226 self.visit_str(&v)
227 }
228
229 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
230 where
231 E: de::Error,
232 {
233 RhsVisitor.visit_str(value).map(|r| REntry::Rhs(vec![r]))
234 }
235
236 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
237 where
238 A: de::SeqAccess<'de>,
239 {
240 let mut arr = Vec::new();
241
242 while let Some(rhs) = seq.next_element()? {
243 arr.push(rhs);
244 }
245
246 Ok(REntry::Rhs(arr))
247 }
248
249 fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
250 where
251 A: de::MapAccess<'de>,
252 {
253 ObjectVisitor
254 .visit_map(map)
255 .map(|obj| REntry::Obj(Box::new(obj)))
256 }
257
258 fn visit_none<E>(self) -> Result<Self::Value, E>
259 where
260 E: de::Error,
261 {
262 Ok(REntry::Thrash)
263 }
264
265 fn visit_unit<E>(self) -> Result<Self::Value, E>
266 where
267 E: de::Error,
268 {
269 self.visit_none()
270 }
271}
272
273impl<'de> Deserialize<'de> for REntry {
274 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
275 where
276 D: Deserializer<'de>,
277 {
278 deserializer.deserialize_any(REntryVisitor)
279 }
280}