plonk_wasm/wasm_ocaml_serde/
de.rs1use super::{Error, Result};
2use js_sys::{Array, ArrayBuffer, Number, Uint8Array};
3use serde::de::{self, value::SeqDeserializer, Error as _, IntoDeserializer};
4use wasm_bindgen::{JsCast, JsValue, UnwrapThrowExt};
5
6struct ObjectAccess {
7 data: Array,
8 fields: core::slice::Iter<'static, &'static str>,
9 idx: u32,
10 next_value: Option<Deserializer>,
11}
12
13impl ObjectAccess {
14 fn new(data: Array, fields: &'static [&'static str]) -> Self {
15 Self {
18 data,
19 idx: 1,
20 fields: fields.iter(),
21 next_value: None,
22 }
23 }
24}
25
26fn str_deserializer(s: &str) -> de::value::StrDeserializer<Error> {
27 de::IntoDeserializer::into_deserializer(s)
28}
29
30impl<'de> de::MapAccess<'de> for ObjectAccess {
31 type Error = Error;
32
33 fn next_key_seed<K: de::DeserializeSeed<'de>>(&mut self, seed: K) -> Result<Option<K::Value>> {
34 debug_assert!(self.next_value.is_none());
35
36 match self.fields.next() {
37 None => Ok(None),
38 Some(field) => {
39 self.next_value = Some(Deserializer::from(self.data.get(self.idx)));
40 self.idx += 1;
41 Ok(Some(seed.deserialize(str_deserializer(field))?))
42 }
43 }
44 }
45
46 fn next_value_seed<V: de::DeserializeSeed<'de>>(&mut self, seed: V) -> Result<V::Value> {
47 seed.deserialize(self.next_value.take().unwrap_throw())
48 }
49}
50
51pub struct Deserializer(JsValue);
52
53impl From<JsValue> for Deserializer {
55 fn from(value: JsValue) -> Self {
56 Self(value)
57 }
58}
59
60impl<'de> IntoDeserializer<'de, Error> for Deserializer {
63 type Deserializer = Self;
64
65 fn into_deserializer(self) -> Self::Deserializer {
66 self
67 }
68}
69
70impl Deserializer {
71 fn as_bytes(&self) -> Option<Vec<u8>> {
72 if let Some(v) = self.0.dyn_ref::<Uint8Array>() {
73 Some(v.to_vec())
74 } else {
75 self.0
77 .dyn_ref::<ArrayBuffer>()
78 .map(|v| Uint8Array::new(v).to_vec())
79 }
80 }
81}
82
83impl<'de> de::Deserializer<'de> for Deserializer {
84 type Error = Error;
85
86 fn deserialize_any<V: de::Visitor<'de>>(self, _: V) -> Result<V::Value> {
87 Err(Error::custom(
88 "Inferring the serialized type is not implemented",
89 ))
90 }
91
92 fn deserialize_unit<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
93 visitor.visit_unit()
94 }
95
96 fn deserialize_unit_struct<V: de::Visitor<'de>>(
97 self,
98 _: &'static str,
99 _: V,
100 ) -> Result<V::Value> {
101 Err(Error::custom(
102 "Deserializing unit structs is not implemented",
103 ))
104 }
105
106 fn deserialize_bool<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
107 let x = self.0.unchecked_into::<Number>().as_f64().unwrap() as u32;
108 visitor.visit_bool(x != 0)
109 }
110
111 fn deserialize_f32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
112 visitor.visit_f32(self.0.unchecked_into::<Number>().as_f64().unwrap() as f32)
113 }
114
115 fn deserialize_f64<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
116 visitor.visit_f64(self.0.unchecked_into::<Number>().as_f64().unwrap())
117 }
118
119 fn deserialize_identifier<V: de::Visitor<'de>>(self, _: V) -> Result<V::Value> {
120 Err(Error::custom("Deserializing strings is not implemented"))
121 }
122
123 fn deserialize_str<V: de::Visitor<'de>>(self, _: V) -> Result<V::Value> {
124 Err(Error::custom("Deserializing strings is not implemented"))
125 }
126
127 fn deserialize_string<V: de::Visitor<'de>>(self, _: V) -> Result<V::Value> {
128 Err(Error::custom("Deserializing strings is not implemented"))
129 }
130
131 fn deserialize_i8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
132 visitor.visit_i8(self.0.unchecked_into::<Number>().as_f64().unwrap() as i8)
133 }
134
135 fn deserialize_i16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
136 visitor.visit_i16(self.0.unchecked_into::<Number>().as_f64().unwrap() as i16)
137 }
138
139 fn deserialize_i32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
140 visitor.visit_i32(self.0.unchecked_into::<Number>().as_f64().unwrap() as i32)
141 }
142
143 fn deserialize_u8<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
144 visitor.visit_u8(self.0.unchecked_into::<Number>().as_f64().unwrap() as u8)
145 }
146
147 fn deserialize_u16<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
148 visitor.visit_u16(self.0.unchecked_into::<Number>().as_f64().unwrap() as u16)
149 }
150
151 fn deserialize_u32<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
152 visitor.visit_u32(self.0.unchecked_into::<Number>().as_f64().unwrap() as u32)
153 }
154
155 fn deserialize_i64<V: de::Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
156 Err(Error::custom("Deserializing i64 is not implemented"))
157 }
158
159 fn deserialize_u64<V: de::Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
160 Err(Error::custom("Deserializing u64 is not implemented"))
161 }
162
163 fn deserialize_i128<V: de::Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
164 Err(Error::custom("Deserializing i128 is not implemented"))
165 }
166
167 fn deserialize_u128<V: de::Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
168 Err(Error::custom("Deserializing u128 is not implemented"))
169 }
170
171 fn deserialize_char<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
172 visitor.visit_char((self.0.unchecked_into::<Number>().as_f64().unwrap() as u8) as char)
173 }
174
175 fn deserialize_option<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
178 if let Ok(arr) = self.0.dyn_into::<Array>() {
179 visitor.visit_some(Into::<Deserializer>::into(arr.get(1)))
180 } else {
181 visitor.visit_none()
182 }
183 }
184
185 fn deserialize_newtype_struct<V: de::Visitor<'de>>(
186 self,
187 _name: &'static str,
188 _visitor: V,
189 ) -> Result<V::Value> {
190 Err(Error::custom(
191 "Deserializing newtype structus is not implemented",
192 ))
193 }
194
195 fn deserialize_seq<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
196 let arr = self.0.unchecked_into::<Array>();
197 visitor.visit_seq(SeqDeserializer::new(
198 arr.iter().skip(1).map(Deserializer::from),
199 ))
200 }
201
202 fn deserialize_tuple<V: de::Visitor<'de>>(self, _len: usize, visitor: V) -> Result<V::Value> {
203 self.deserialize_seq(visitor)
204 }
205
206 fn deserialize_tuple_struct<V: de::Visitor<'de>>(
207 self,
208 _name: &'static str,
209 _len: usize,
210 _visitor: V,
211 ) -> Result<V::Value> {
212 Err(Error::custom(
213 "Deserializing tuple structs is not implemented",
214 ))
215 }
216
217 fn deserialize_map<V: de::Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
218 Err(Error::custom("Deserializing maps is not implemented"))
219 }
220
221 fn deserialize_struct<V: de::Visitor<'de>>(
222 self,
223 _name: &'static str,
224 fields: &'static [&'static str],
225 visitor: V,
226 ) -> Result<V::Value> {
227 let arr = self.0.unchecked_into::<Array>();
228 visitor.visit_map(ObjectAccess::new(arr, fields))
229 }
230
231 fn deserialize_enum<V: de::Visitor<'de>>(
232 self,
233 _: &'static str,
234 _: &'static [&'static str],
235 _: V,
236 ) -> Result<V::Value> {
237 Err(Error::custom("Deserializing enums is not implemented"))
238 }
239
240 fn deserialize_ignored_any<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
241 visitor.visit_unit()
242 }
243
244 fn deserialize_bytes<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
245 self.deserialize_byte_buf(visitor)
246 }
247
248 fn deserialize_byte_buf<V: de::Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
249 if let Some(bytes) = self.as_bytes() {
250 visitor.visit_byte_buf(bytes)
251 } else {
252 Err(Error::custom("Type error while deserializing bytes"))
253 }
254 }
255
256 #[inline]
257 fn is_human_readable(&self) -> bool {
258 false
259 }
260}
261
262impl<'de> de::VariantAccess<'de> for Deserializer {
263 type Error = Error;
264
265 fn unit_variant(self) -> Result<()> {
266 Err(Error::custom("Deserializing variants is not implemented"))
267 }
268
269 fn newtype_variant_seed<T: de::DeserializeSeed<'de>>(self, _: T) -> Result<T::Value> {
270 Err(Error::custom("Deserializing variants is not implemented"))
271 }
272
273 fn tuple_variant<V: de::Visitor<'de>>(self, _: usize, _: V) -> Result<V::Value> {
274 Err(Error::custom("Deserializing variants is not implemented"))
275 }
276
277 fn struct_variant<V: de::Visitor<'de>>(
278 self,
279 _: &'static [&'static str],
280 _: V,
281 ) -> Result<V::Value> {
282 Err(Error::custom("Deserializing variants is not implemented"))
283 }
284}