Skip to content

Commit 6281985

Browse files
authored
Fix map roundtrips in untagged enums (#64)
1 parent b1b73ac commit 6281985

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

src/de.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use js_sys::{Array, ArrayBuffer, JsString, Number, Object, Symbol, Uint8Array};
1+
use js_sys::{Array, ArrayBuffer, JsString, Map, Number, Object, Symbol, Uint8Array};
22
use serde::de::value::{MapDeserializer, SeqDeserializer};
33
use serde::de::{self, IntoDeserializer};
44
use std::convert::TryFrom;
@@ -317,12 +317,15 @@ impl<'de> de::Deserializer<'de> for Deserializer {
317317
// (see https://github.com/RReverser/serde-wasm-bindgen/pull/4#discussion_r352245020).
318318
//
319319
// We expect such enums to be represented via plain JS objects, so let's explicitly
320-
// exclude Sets, Maps and any other iterables. These should be deserialized via concrete
320+
// exclude Sets and other iterables. These should be deserialized via concrete
321321
// `deserialize_*` methods instead of us trying to guess the right target type.
322322
//
323+
// We still do support Map, so that the format described here stays a self-describing
324+
// format: we happen to serialize to Map, and it is not ambiguous.
325+
//
323326
// Hopefully we can rid of these hacks altogether once
324327
// https://github.com/serde-rs/serde/issues/1183 is implemented / fixed on serde side.
325-
!Symbol::iterator().js_in(&self.value)
328+
(!Symbol::iterator().js_in(&self.value) || self.value.has_type::<Map>())
326329
{
327330
self.deserialize_map(visitor)
328331
} else {

tests/common/mod.rs

+26
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ use wasm_bindgen_test::wasm_bindgen_test;
1313

1414
const SERIALIZER: Serializer = Serializer::new();
1515

16+
const JSON_SERIALIZER: Serializer = Serializer::json_compatible();
17+
1618
const BIGINT_SERIALIZER: Serializer =
1719
Serializer::new().serialize_large_number_types_as_bigints(true);
1820

@@ -664,6 +666,30 @@ fn enums() {
664666
}
665667
}
666668

669+
#[wasm_bindgen_test]
670+
fn serde_json_value_with_json() {
671+
test_via_round_trip_with_config(
672+
serde_json::from_str::<serde_json::Value>("[0, \"foo\"]").unwrap(),
673+
&JSON_SERIALIZER,
674+
);
675+
test_via_round_trip_with_config(
676+
serde_json::from_str::<serde_json::Value>(r#"{"foo": "bar"}"#).unwrap(),
677+
&JSON_SERIALIZER,
678+
);
679+
}
680+
681+
#[wasm_bindgen_test]
682+
fn serde_json_value_with_default() {
683+
test_via_round_trip_with_config(
684+
serde_json::from_str::<serde_json::Value>("[0, \"foo\"]").unwrap(),
685+
&SERIALIZER,
686+
);
687+
test_via_round_trip_with_config(
688+
serde_json::from_str::<serde_json::Value>(r#"{"foo": "bar"}"#).unwrap(),
689+
&SERIALIZER,
690+
);
691+
}
692+
667693
#[wasm_bindgen_test]
668694
fn preserved_value() {
669695
#[derive(serde::Deserialize, serde::Serialize, PartialEq, Clone, Debug)]

0 commit comments

Comments
 (0)