step_p21/ast/de/
record.rs1use crate::ast::*;
2use serde::{
3 de::{self, IntoDeserializer},
4 forward_to_deserialize_any,
5};
6
7impl<'de> de::Deserializer<'de> for &Record {
8 type Error = crate::error::Error;
9
10 forward_to_deserialize_any! {
11 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
12 bytes byte_buf option unit unit_struct newtype_struct seq tuple
13 tuple_struct map enum identifier ignored_any
14 }
15
16 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
17 where
18 V: de::Visitor<'de>,
19 {
20 visitor.visit_map(RecordDeserializer::new(&self.name, &self.parameter))
21 }
22
23 fn deserialize_struct<V>(
24 self,
25 name: &'static str,
26 fields: &'static [&'static str],
27 visitor: V,
28 ) -> Result<V::Value, Self::Error>
29 where
30 V: de::Visitor<'de>,
31 {
32 if name == self.name {
33 if let Parameter::List(ref parameters) = self.parameter {
34 return visitor.visit_map(RecordStructDeserializer::new(
35 fields, parameters,
36 ));
37 }
38 }
39 Self::deserialize_any(self, visitor)
40 }
41}
42
43#[derive(Debug)]
45pub struct RecordDeserializer<'record> {
46 key: Option<&'record str>,
47 value: &'record Parameter,
48}
49
50impl<'de, 'record> de::Deserializer<'de> for RecordDeserializer<'record> {
51 type Error = crate::error::Error;
52
53 forward_to_deserialize_any! {
54 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
55 bytes byte_buf option unit unit_struct newtype_struct seq tuple
56 struct tuple_struct map enum identifier ignored_any
57 }
58
59 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
60 where
61 V: de::Visitor<'de>,
62 {
63 visitor.visit_map(self)
64 }
65}
66
67impl<'record> RecordDeserializer<'record> {
68 pub fn new(key: &'record str, value: &'record Parameter) -> Self {
69 RecordDeserializer {
70 key: Some(key),
71 value,
72 }
73 }
74}
75
76impl<'de, 'record> de::MapAccess<'de> for RecordDeserializer<'record> {
78 type Error = crate::error::Error;
79
80 fn next_key_seed<K>(
81 &mut self,
82 seed: K,
83 ) -> Result<Option<K::Value>, Self::Error>
84 where
85 K: de::DeserializeSeed<'de>,
86 {
87 if let Some(key) = self.key.take() {
88 let key: de::value::StrDeserializer<Self::Error> =
89 key.into_deserializer();
90 let key: K::Value = seed.deserialize(key)?;
91 Ok(Some(key))
92 } else {
93 Ok(None)
94 }
95 }
96
97 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
98 where
99 V: de::DeserializeSeed<'de>,
100 {
101 let value: V::Value = seed.deserialize(self.value)?;
102 Ok(value)
103 }
104}
105
106#[derive(Debug)]
108pub struct RecordStructDeserializer<'a> {
109 cursor: usize,
110 fields: &'a [&'static str],
111 parameters: &'a [Parameter],
112}
113
114impl<'a> RecordStructDeserializer<'a> {
115 pub fn new(
116 fields: &'a [&'static str],
117 parameters: &'a [Parameter],
118 ) -> Self {
119 Self {
120 cursor: 0,
121 fields,
122 parameters,
123 }
124 }
125}
126
127impl<'de, 'a> de::Deserializer<'de> for RecordStructDeserializer<'a> {
128 type Error = crate::error::Error;
129
130 forward_to_deserialize_any! {
131 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
132 bytes byte_buf option unit unit_struct newtype_struct seq tuple
133 struct tuple_struct map enum identifier ignored_any
134 }
135
136 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
137 where
138 V: de::Visitor<'de>,
139 {
140 visitor.visit_map(self)
141 }
142}
143
144impl<'de, 'a> de::MapAccess<'de> for RecordStructDeserializer<'a> {
145 type Error = crate::error::Error;
146
147 fn next_key_seed<K>(
148 &mut self,
149 seed: K,
150 ) -> Result<Option<K::Value>, Self::Error>
151 where
152 K: de::DeserializeSeed<'de>,
153 {
154 if self.cursor < self.fields.len() {
155 let key: de::value::StrDeserializer<Self::Error> =
156 self.fields[self.cursor].into_deserializer();
157 let key: K::Value = seed.deserialize(key)?;
158 Ok(Some(key))
159 } else {
160 Ok(None)
161 }
162 }
163
164 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Self::Error>
165 where
166 V: de::DeserializeSeed<'de>,
167 {
168 assert!(self.cursor < self.parameters.len());
169 let value: V::Value =
170 seed.deserialize(&self.parameters[self.cursor])?;
171 self.cursor += 1;
172 Ok(value)
173 }
174}