1use std::fmt::Display;
4
5use serde::{
6 ser::{
7 SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple,
8 SerializeTupleStruct, SerializeTupleVariant,
9 },
10 Serialize,
11};
12
13#[derive(Debug, Clone, PartialEq)]
15pub enum Ast {
16 Bool(bool),
18
19 I8(i8),
21 I16(i16),
23 I32(i32),
25 I64(i64),
27
28 U8(u8),
30 U16(u16),
32 U32(u32),
34 U64(u64),
36
37 F32(f32),
39 F64(f64),
41
42 Char(char),
44 Str(String),
46 Bytes(Vec<u8>),
48
49 None,
51 Some(Box<Ast>),
53
54 Unit,
56 UnitStruct(&'static str),
58 UnitVariant {
60 name: &'static str,
62 variant_index: u32,
64 variant: &'static str,
66 },
67
68 NewtypeStruct {
70 name: &'static str,
72 value: Box<Ast>,
74 },
75 NewtypeVariant {
77 name: &'static str,
79 variant_index: u32,
81 variant: &'static str,
83 value: Box<Ast>,
85 },
86
87 Seq {
89 len: Option<usize>,
91 ops: Vec<Seq>,
93 },
94
95 Tuple {
97 len: usize,
99 ops: Vec<Tuple>,
101 },
102 TupleStruct {
104 name: &'static str,
106 len: usize,
108 ops: Vec<TupleStruct>,
110 },
111 TupleVariant {
113 name: &'static str,
115 variant_index: u32,
117 variant: &'static str,
119 len: usize,
121 ops: Vec<TupleVariant>,
123 },
124
125 Map {
127 len: Option<usize>,
129 ops: Vec<Map>,
131 },
132 Struct {
134 name: &'static str,
136 len: usize,
138 ops: Vec<Struct>,
140 },
141 StructVariant {
143 name: &'static str,
145 variant_index: u32,
147 variant: &'static str,
149 len: usize,
151 ops: Vec<StructVariant>,
153 },
154}
155impl Display for Ast {
156 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
157 write!(f, "{:#?}", self)
158 }
159}
160impl Serialize for Ast {
161 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
162 where
163 S: serde::Serializer,
164 {
165 match self {
166 Ast::Bool(v) => serializer.serialize_bool(*v),
167 Ast::I8(v) => serializer.serialize_i8(*v),
168 Ast::I16(v) => serializer.serialize_i16(*v),
169 Ast::I32(v) => serializer.serialize_i32(*v),
170 Ast::I64(v) => serializer.serialize_i64(*v),
171 Ast::U8(v) => serializer.serialize_u8(*v),
172 Ast::U16(v) => serializer.serialize_u16(*v),
173 Ast::U32(v) => serializer.serialize_u32(*v),
174 Ast::U64(v) => serializer.serialize_u64(*v),
175 Ast::F32(v) => serializer.serialize_f32(*v),
176 Ast::F64(v) => serializer.serialize_f64(*v),
177 Ast::Char(v) => serializer.serialize_char(*v),
178 Ast::Str(v) => serializer.serialize_str(v),
179 Ast::Bytes(v) => serializer.serialize_bytes(v),
180 Ast::None => serializer.serialize_none(),
181 Ast::Some(v) => serializer.serialize_some(v),
182 Ast::Unit => serializer.serialize_unit(),
183 Ast::UnitStruct(name) => serializer.serialize_unit_struct(name),
184 Ast::UnitVariant {
185 name,
186 variant_index,
187 variant,
188 } => serializer.serialize_unit_variant(name, *variant_index, variant),
189 Ast::NewtypeStruct { name, value } => serializer.serialize_newtype_struct(name, value),
190 Ast::NewtypeVariant {
191 name,
192 variant_index,
193 variant,
194 value,
195 } => serializer.serialize_newtype_variant(name, *variant_index, variant, value),
196 Ast::Seq { len, ops } => {
197 let mut s = serializer.serialize_seq(*len)?;
198 for op in ops {
199 match op {
200 Seq::Element { value } => s.serialize_element(value)?,
201 }
202 }
203 s.end()
204 }
205 Ast::Tuple { len, ops } => {
206 let mut s = serializer.serialize_tuple(*len)?;
207 for op in ops {
208 match op {
209 Tuple::Element { value } => s.serialize_element(value)?,
210 }
211 }
212 s.end()
213 }
214 Ast::TupleStruct { name, len, ops } => {
215 let mut s = serializer.serialize_tuple_struct(name, *len)?;
216 for op in ops {
217 match op {
218 TupleStruct::Field { value } => s.serialize_field(value)?,
219 }
220 }
221 s.end()
222 }
223 Ast::TupleVariant {
224 name,
225 variant_index,
226 variant,
227 len,
228 ops,
229 } => {
230 let mut s =
231 serializer.serialize_tuple_variant(name, *variant_index, variant, *len)?;
232 for op in ops {
233 match op {
234 TupleVariant::Field { value } => s.serialize_field(value)?,
235 }
236 }
237 s.end()
238 }
239 Ast::Map { len, ops } => {
240 let mut s = serializer.serialize_map(*len)?;
241 for op in ops {
242 match op {
243 Map::Key { key } => s.serialize_key(key)?,
244 Map::Value { value } => s.serialize_value(value)?,
245 }
246 }
247 s.end()
248 }
249 Ast::Struct { name, len, ops } => {
250 let mut s = serializer.serialize_struct(name, *len)?;
251 for op in ops {
252 match op {
253 Struct::Field { key, value } => s.serialize_field(key, value)?,
254 Struct::Skip { key } => s.skip_field(key)?,
255 }
256 }
257 s.end()
258 }
259 Ast::StructVariant {
260 name,
261 variant_index,
262 variant,
263 len,
264 ops,
265 } => {
266 let mut s =
267 serializer.serialize_struct_variant(name, *variant_index, variant, *len)?;
268 for op in ops {
269 match op {
270 StructVariant::Field { key, value } => s.serialize_field(key, value)?,
271 StructVariant::Skip { key } => s.skip_field(key)?,
272 }
273 }
274 s.end()
275 }
276 }
277 }
278}
279
280#[derive(Debug, Clone, PartialEq)]
282pub enum Tuple {
283 Element {
285 value: Box<Ast>,
287 },
288}
289
290#[derive(Debug, Clone, PartialEq)]
292pub enum TupleStruct {
293 Field {
295 value: Box<Ast>,
297 },
298}
299
300#[derive(Debug, Clone, PartialEq)]
302pub enum TupleVariant {
303 Field {
305 value: Box<Ast>,
307 },
308}
309
310#[derive(Debug, Clone, PartialEq)]
312pub enum Seq {
313 Element {
315 value: Box<Ast>,
317 },
318}
319
320#[derive(Debug, Clone, PartialEq)]
322pub enum Map {
323 Key {
325 key: Box<Ast>,
327 },
328 Value {
330 value: Box<Ast>,
332 },
333}
334
335#[derive(Debug, Clone, PartialEq)]
337pub enum Struct {
338 Field {
340 key: &'static str,
342 value: Box<Ast>,
344 },
345 Skip {
347 key: &'static str,
349 },
350}
351
352#[derive(Debug, Clone, PartialEq)]
354pub enum StructVariant {
355 Field {
357 key: &'static str,
359 value: Box<Ast>,
361 },
362 Skip {
364 key: &'static str,
366 },
367}