1use crate::imp::{
2 core::{Guid, OnlyGuid},
3 prelude::*
4};
5use serde::ser;
6use std::{cell::RefCell, mem, rc::Rc};
7
8#[derive(Debug, thiserror::Error)]
9pub enum Error {
10 #[error("{0:}")]
11 Msg(String),
12 #[error("Couldn't construct map from odd number of values")]
13 OddMap,
14 #[error("Key must be string")]
15 InvalidKey,
16 #[error("Not supported")]
17 NotSupported,
18 #[error("Failed to serialize JsHandle")]
19 JsHandle,
20 #[error("Failed to serialize DateTime")]
21 DateTime,
22 #[error(transparent)]
23 Serde(#[from] serde_json::error::Error)
24}
25
26impl serde::ser::Error for Error {
27 fn custom<T>(msg: T) -> Self
28 where
29 T: std::fmt::Display
30 {
31 Self::Msg(msg.to_string())
32 }
33}
34
35#[derive(Clone, Default)]
36pub(crate) struct Serializer {
37 handles: Rc<RefCell<Vec<OnlyGuid>>>,
38
39 seq: Vec<Seq>,
40 t: Vec<TupleVariant>,
41 om: Vec<ObjectM>,
42 os: Vec<ObjectS>,
43 s: Vec<StructVariant>
44}
45
46pub(crate) fn to_value<T>(x: &T) -> Result<Value, Error>
48where
49 T: Serialize
50{
51 let mut serializer = Serializer::default();
52 let value = x.serialize(&mut serializer)?;
53 let mut m = Map::new();
54 m.insert("value".into(), value);
55 m.insert(
56 "handles".into(),
57 serde_json::to_value(serializer.handles())?
58 );
59 Ok(m.into())
60}
61
62impl Serializer {
63 fn handles(self) -> Vec<OnlyGuid> { self.handles.take() }
64}
65
66fn convert_kv<M: IntoIterator<Item = (String, Value)>>(map: M) -> Map<String, Value> {
67 let entries = Value::Array(
68 map.into_iter()
69 .map(|(k, v)| {
70 let mut entry = Map::new();
71 entry.insert("k".into(), k.into());
72 entry.insert("v".into(), v);
73 Value::from(entry)
74 })
75 .collect()
76 );
77 let mut res = Map::new();
78 res.insert("o".into(), entries);
79 res
80}
81
82impl<'a> ser::Serializer for &'a mut Serializer {
83 type Ok = Value;
84 type Error = Error;
85
86 type SerializeSeq = &'a mut Seq;
87 type SerializeTuple = &'a mut Seq;
88 type SerializeTupleStruct = &'a mut Seq;
89 type SerializeTupleVariant = &'a mut TupleVariant;
90 type SerializeMap = &'a mut ObjectM;
91 type SerializeStruct = &'a mut ObjectS;
92 type SerializeStructVariant = &'a mut StructVariant;
93
94 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
95 let mut m = Map::new();
96 m.insert("b".into(), v.into());
97 Ok(m.into())
98 }
99
100 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
101 let mut m = Map::new();
102 m.insert("n".into(), v.into());
103 Ok(m.into())
104 }
105 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> { self.serialize_i64(v.into()) }
106 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> { self.serialize_i64(v.into()) }
107 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> { self.serialize_i64(v.into()) }
108
109 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
110 let mut m = Map::new();
111 m.insert("n".into(), v.into());
112 Ok(m.into())
113 }
114 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> { self.serialize_u64(v.into()) }
115 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> { self.serialize_u64(v.into()) }
116 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> { self.serialize_u64(v.into()) }
117
118 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
119 let mut m = Map::new();
120 if v.is_nan() {
121 m.insert("v".into(), "NaN".into())
122 } else if v.is_infinite() {
123 m.insert(
124 "v".into(),
125 if v.is_sign_negative() {
126 "-Infinity"
127 } else {
128 "Infinity"
129 }
130 .into()
131 )
132 } else if v.is_sign_negative() && v == -0.0 {
133 m.insert("v".into(), "-0".into())
134 } else {
135 m.insert("n".into(), v.into())
136 };
137 Ok(m.into())
138 }
139 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> { Ok(f64::from(v).into()) }
140
141 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
142 let mut m = Map::new();
143 m.insert("s".into(), v.into());
144 Ok(m.into())
145 }
146 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
147 let mut m = Map::new();
148 m.insert("s".into(), v.to_string().into());
149 Ok(m.into())
150 }
151
152 fn serialize_bytes(self, _v: &[u8]) -> Result<Self::Ok, Self::Error> {
153 Err(Error::NotSupported)
154 }
155
156 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
157 let mut m = Map::new();
158 m.insert("v".into(), "null".into());
159 Ok(m.into())
160 }
161 fn serialize_some<T>(self, v: &T) -> Result<Self::Ok, Self::Error>
162 where
163 T: ?Sized + Serialize
164 {
165 v.serialize(self)
166 }
167 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
168 let mut m = Map::new();
169 m.insert("v".into(), "undefined".into());
170 Ok(m.into())
171 }
172 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
173 self.serialize_unit()
174 }
175
176 fn serialize_unit_variant(
177 self,
178 _name: &'static str,
179 _variant_index: u32,
180 variant: &'static str
181 ) -> Result<Self::Ok, Self::Error> {
182 self.serialize_str(variant)
183 }
184
185 fn serialize_newtype_struct<T>(
186 self,
187 _name: &'static str,
188 value: &T
189 ) -> Result<Self::Ok, Self::Error>
190 where
191 T: ?Sized + Serialize
192 {
193 value.serialize(self)
194 }
195
196 fn serialize_newtype_variant<T>(
197 self,
198 _name: &'static str,
199 _variant_index: u32,
200 variant: &'static str,
201 value: &T
202 ) -> Result<Self::Ok, Self::Error>
203 where
204 T: ?Sized + Serialize
205 {
206 let map = convert_kv(Some((variant.into(), value.serialize(self)?)));
207 Ok(map.into())
208 }
209
210 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
211 self.seq.push(Seq::new(self.clone()));
212 Ok(self.seq.last_mut().unwrap())
213 }
214
215 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeSeq, Self::Error> {
216 self.serialize_seq(Some(len))
217 }
218
219 fn serialize_tuple_struct(
220 self,
221 _name: &'static str,
222 len: usize
223 ) -> Result<Self::SerializeSeq, Self::Error> {
224 self.serialize_seq(Some(len))
225 }
226
227 fn serialize_tuple_variant(
228 self,
229 _name: &'static str,
230 _variant_index: u32,
231 variant: &'static str,
232 _len: usize
233 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
234 self.t.push(TupleVariant::new(self.clone(), variant));
235 Ok(self.t.last_mut().unwrap())
236 }
237
238 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
239 self.om.push(ObjectM::new(self.clone()));
240 Ok(self.om.last_mut().unwrap())
241 }
242
243 fn serialize_struct(
244 self,
245 name: &'static str,
246 _len: usize
247 ) -> Result<Self::SerializeStruct, Self::Error> {
248 self.os.push(ObjectS::new(self.clone(), name));
249 Ok(self.os.last_mut().unwrap())
250 }
251
252 fn serialize_struct_variant(
253 self,
254 _name: &'static str,
255 _variant_index: u32,
256 variant: &'static str,
257 _len: usize
258 ) -> Result<Self::SerializeStructVariant, Self::Error> {
259 self.s.push(StructVariant::new(self.clone(), variant));
260 Ok(self.s.last_mut().unwrap())
261 }
262}
263
264#[derive(Clone)]
265pub(crate) struct Seq {
266 values: Vec<Value>,
267 prime: Serializer
268}
269
270impl Seq {
271 fn new(prime: Serializer) -> Self {
272 Self {
273 values: Vec::new(),
274 prime
275 }
276 }
277}
278
279impl<'a> ser::SerializeSeq for &'a mut Seq {
280 type Ok = Value;
281 type Error = Error;
282
283 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
284 where
285 T: ?Sized + Serialize
286 {
287 self.values.push(value.serialize(&mut self.prime)?);
288 Ok(())
289 }
290
291 fn end(self) -> Result<Self::Ok, Self::Error> {
292 let mut m = Map::new();
293 let mut vs = Vec::new();
294 mem::swap(&mut self.values, &mut vs);
295 m.insert("a".into(), vs.into());
296 Ok(m.into())
297 }
298}
299
300impl<'a> ser::SerializeTuple for &'a mut Seq {
301 type Ok = Value;
302 type Error = Error;
303
304 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
305 where
306 T: ?Sized + Serialize
307 {
308 self.values.push(value.serialize(&mut self.prime)?);
309 Ok(())
310 }
311
312 fn end(self) -> Result<Self::Ok, Self::Error> {
313 let mut m = Map::new();
314 let mut vs = Vec::new();
315 mem::swap(&mut self.values, &mut vs);
316 m.insert("a".into(), vs.into());
317 Ok(m.into())
318 }
319}
320
321impl<'a> ser::SerializeTupleStruct for &'a mut Seq {
322 type Ok = Value;
323 type Error = Error;
324
325 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
326 where
327 T: ?Sized + Serialize
328 {
329 self.values.push(value.serialize(&mut self.prime)?);
330 Ok(())
331 }
332
333 fn end(self) -> Result<Self::Ok, Self::Error> {
334 let mut m = Map::new();
335 let mut vs = Vec::new();
336 mem::swap(&mut self.values, &mut vs);
337 m.insert("a".into(), vs.into());
338 Ok(m.into())
339 }
340}
341
342#[derive(Clone)]
343pub(crate) struct TupleVariant {
344 values: Vec<Value>,
345 variant: &'static str,
346 prime: Serializer
347}
348
349impl TupleVariant {
350 fn new(prime: Serializer, variant: &'static str) -> Self {
351 Self {
352 values: Vec::new(),
353 variant,
354 prime
355 }
356 }
357}
358
359impl<'a> ser::SerializeTupleVariant for &'a mut TupleVariant {
360 type Ok = Value;
361 type Error = Error;
362
363 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
364 where
365 T: ?Sized + Serialize
366 {
367 self.values.push(value.serialize(&mut self.prime)?);
368 Ok(())
369 }
370
371 fn end(self) -> Result<Self::Ok, Self::Error> {
372 let a = {
373 let mut a = Map::new();
374 let mut vs = Vec::new();
375 mem::swap(&mut self.values, &mut vs);
376 a.insert("a".into(), vs.into());
377 a
378 };
379 let o = convert_kv(Some((self.variant.into(), a.into())));
380 Ok(o.into())
381 }
382}
383
384#[derive(Clone)]
385pub(crate) struct ObjectS {
386 name: &'static str,
387 map: Map<String, Value>,
388 prime: Serializer,
389 guid: Option<Str<Guid>>,
390 d: Option<String>
391}
392
393#[derive(Clone)]
394pub(crate) struct ObjectM {
395 keys: Vec<String>,
396 values: Vec<Value>,
397 prime: Serializer,
398 turn: bool
399}
400
401impl ObjectS {
402 fn new(prime: Serializer, name: &'static str) -> Self {
403 Self {
404 name,
405 prime,
406 map: Map::new(),
407 guid: None,
408 d: None
409 }
410 }
411}
412
413impl ObjectM {
414 fn new(prime: Serializer) -> Self {
415 Self {
416 prime,
417 keys: Vec::new(),
418 values: Vec::new(),
419 turn: false
420 }
421 }
422}
423
424impl<'a> ser::SerializeStruct for &'a mut ObjectS {
425 type Ok = Value;
426 type Error = Error;
427
428 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
429 where
430 T: ?Sized + Serialize
431 {
432 let v = value.serialize(&mut self.prime)?;
433 if (self.name == "4a9c3811-6f00-49e5-8a81-939f932d9061"
434 || self.name == "fff9ae7f-9070-480f-9a8a-3d4b66923f7d")
435 && key == "guid"
436 {
437 let g = match v {
438 Value::Object(m) => {
439 let (_, v) = m.into_iter().next().ok_or(Error::JsHandle)?;
440 let s = match v {
441 Value::String(s) => s,
442 _ => return Err(Error::JsHandle)
443 };
444 Str::validate(s).unwrap()
445 }
446 _ => return Err(Error::JsHandle)
447 };
448 self.guid = Some(g);
449 return Ok(());
450 }
451 if self.name == "e7ee19d3-64cb-4286-8762-6dd8ab78eb89" && key == "d" {
452 let d = match v {
453 Value::Object(m) => {
454 let (_, v) = m.into_iter().next().ok_or(Error::DateTime)?;
455 match v {
456 Value::String(s) => s,
457 _ => return Err(Error::DateTime)
458 }
459 }
460 _ => return Err(Error::JsHandle)
461 };
462 self.d = Some(d);
463 return Ok(());
464 }
465 self.map.insert(key.into(), v);
466 Ok(())
467 }
468
469 fn end(self) -> Result<Self::Ok, Self::Error> {
470 if self.name == "4a9c3811-6f00-49e5-8a81-939f932d9061"
471 || self.name == "fff9ae7f-9070-480f-9a8a-3d4b66923f7d"
472 {
473 let handles = &mut self.prime.handles.borrow_mut();
474 let guid = self.guid.take().ok_or(Error::JsHandle)?;
475 handles.push(OnlyGuid { guid });
476 let idx = handles.len() - 1;
477 let mut m = Map::new();
478 m.insert("h".into(), idx.into());
479 Ok(m.into())
480 } else if self.name == "e7ee19d3-64cb-4286-8762-6dd8ab78eb89" {
481 let d = self.d.take().ok_or(Error::DateTime)?;
482 let mut m = Map::new();
483 m.insert("d".into(), d.into());
484 Ok(m.into())
485 } else {
486 let mut m = Map::new();
487 mem::swap(&mut self.map, &mut m);
488 let o = convert_kv(m);
489 Ok(o.into())
490 }
491 }
492}
493
494impl<'a> ser::SerializeMap for &'a mut ObjectM {
495 type Ok = Value;
496 type Error = Error;
497
498 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
499 where
500 T: ?Sized + Serialize
501 {
502 if self.turn {
503 return Err(Error::OddMap);
504 }
505 let serialized = key.serialize(&mut self.prime)?;
506 let key = match serialized {
507 Value::String(s) => s,
508 _ => return Err(Error::InvalidKey)
509 };
510 self.keys.push(key);
511 self.turn = true;
512 Ok(())
513 }
514
515 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
516 where
517 T: ?Sized + Serialize
518 {
519 if !self.turn {
520 return Err(Error::OddMap);
521 }
522 self.values.push(value.serialize(&mut self.prime)?);
523 self.turn = false;
524 Ok(())
525 }
526
527 fn end(self) -> Result<Self::Ok, Self::Error> {
528 if self.turn {
529 return Err(Error::OddMap);
530 }
531 let mut ks = Vec::new();
532 let mut vs = Vec::new();
533 mem::swap(&mut self.keys, &mut ks);
534 mem::swap(&mut self.values, &mut vs);
535 let entries = ks.into_iter().zip(vs.into_iter());
536 let o = convert_kv(entries);
537 Ok(o.into())
538 }
539}
540
541#[derive(Clone)]
542pub(crate) struct StructVariant {
543 m: Map<String, Value>,
544 variant: &'static str,
545 prime: Serializer
546}
547
548impl StructVariant {
549 fn new(prime: Serializer, variant: &'static str) -> Self {
550 Self {
551 m: Map::new(),
552 variant,
553 prime
554 }
555 }
556}
557
558impl<'a> ser::SerializeStructVariant for &'a mut StructVariant {
559 type Ok = Value;
560 type Error = Error;
561
562 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error>
563 where
564 T: ?Sized + Serialize
565 {
566 self.m.insert(key.into(), value.serialize(&mut self.prime)?);
567 Ok(())
568 }
569
570 fn end(self) -> Result<Self::Ok, Self::Error> {
571 let mut m = Map::new();
572 mem::swap(&mut self.m, &mut m);
573 let inner = convert_kv(m);
574 let external = convert_kv(Some((self.variant.into(), inner.into())));
575 Ok(external.into())
576 }
577}
578
579#[cfg(test)]
580mod tests {
581 use super::*;
582
583 #[test]
584 fn r#struct() {
585 #[derive(Serialize)]
586 struct Test {
587 int: u32,
588 seq: Vec<&'static str>
589 }
590
591 let test = Test {
592 int: 1,
593 seq: vec!["a", "b"]
594 };
595 let expected = r#"{
596 "value":{"o":[{"k":"int","v":{"n":1}},{"k":"seq","v":{"a": [{"s":"a"},{"s":"b"}]}}]},
597 "handles":[]}"#;
598 let v: Value = serde_json::from_str(expected).unwrap();
599 dbg!(&v);
600 assert_eq!(to_value(&test).unwrap(), v);
601 }
602
603 #[test]
604 fn option() {
605 let expected = r#"{
606 "value":{"n":3},
607 "handles": []}"#;
608 let v: Value = serde_json::from_str(expected).unwrap();
609 assert_eq!(to_value(&Some(3)).unwrap(), v);
610 let expected = r#"{
611 "value":{"v":"null"},
612 "handles": []}"#;
613 let v: Value = serde_json::from_str(expected).unwrap();
614 assert_eq!(to_value(&Option::<i32>::None).unwrap(), v);
615 }
616
617 #[test]
618 fn r#enum() {
619 #[derive(Serialize)]
620 enum E {
621 Unit,
622 Newtype(u32),
623 Tuple(u32, u32),
624 Struct { a: u32 }
625 }
626
627 let u = E::Unit;
628 let expected = r#"{"value":{"s":"Unit"}, "handles":[]}"#;
629 let v: Value = serde_json::from_str(expected).unwrap();
630 assert_eq!(to_value(&u).unwrap(), v);
631
632 let u = E::Newtype(1);
633 let expected = r#"{"value":{"o":[{"k":"Newtype","v":{"n":1}}]}, "handles":[]}"#;
634 let v: Value = serde_json::from_str(expected).unwrap();
635 assert_eq!(to_value(&u).unwrap(), v);
636
637 let u = E::Tuple(1, 2);
638 let expected =
639 r#"{"value": {"o":[{"k":"Tuple","v":{"a":[{"n":1},{"n":2}]}}]}, "handles":[]}"#;
640 let v: Value = serde_json::from_str(expected).unwrap();
641 assert_eq!(to_value(&u).unwrap(), v);
642
643 let u = E::Struct { a: 1 };
644 let expected =
645 r#"{"value":{"o":[{"k":"Struct","v":{"o":[{"k":"a","v":{"n":1}}]}}]},"handles":[]}"#;
646 let v: Value = serde_json::from_str(expected).unwrap();
647 assert_eq!(to_value(&u).unwrap(), v);
648 }
649}