Merge pull request #8 from erickt/fix-deserialization

Fix deserialization of unit variants
diff --git a/Cargo.toml b/Cargo.toml
index 0219beb..e45776f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "serde_json5"
-version = "0.1.0"
+version = "0.2.0"
 authors = ["Gary Bressler <geb@google.com>"]
 description = "A Serde (de)serializer for JSON5."
 license = "Apache-2.0"
diff --git a/third_party/src/de.rs b/third_party/src/de.rs
index f69652b..6179cd5 100644
--- a/third_party/src/de.rs
+++ b/third_party/src/de.rs
@@ -598,7 +598,11 @@
     type Error = Error;
 
     fn unit_variant(self) -> Result<()> {
-        Ok(())
+        if let Some(pair) = self.pair {
+            serde::Deserialize::deserialize(&mut Deserializer::from_pair(pair))
+        } else {
+            Ok(())
+        }
     }
 
     fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
diff --git a/third_party/tests/common.rs b/third_party/tests/common.rs
index f7b644c..bd6d721 100644
--- a/third_party/tests/common.rs
+++ b/third_party/tests/common.rs
@@ -1,4 +1,3 @@
-use matches::assert_matches;
 use serde_json5::{Error, Location};
 
 #[allow(unused)]
@@ -6,17 +5,17 @@
 where
     T: ::std::fmt::Debug + ::std::cmp::PartialEq + serde::de::Deserialize<'a>,
 {
-    assert_matches!(serde_json5::from_str::<T>(s), Ok(value) if value == v);
+    assert_eq!(serde_json5::from_str::<T>(s), Ok(v));
 }
 
 #[allow(unused)]
 pub fn deserializes_to_nan_f32(s: &str) {
-    assert_matches!(serde_json5::from_str::<f32>(s), Ok(value) if value.is_nan());
+    assert!(serde_json5::from_str::<f32>(s).unwrap().is_nan());
 }
 
 #[allow(unused)]
 pub fn deserializes_to_nan_f64(s: &str) {
-    assert_matches!(serde_json5::from_str::<f64>(s), Ok(value) if value.is_nan());
+    assert!(serde_json5::from_str::<f64>(s).unwrap().is_nan());
 }
 
 #[allow(unused)]
@@ -24,7 +23,7 @@
 where
     T: ::std::fmt::Debug + ::std::cmp::PartialEq + serde::de::Deserialize<'a>,
 {
-    assert_matches!(serde_json5::from_str::<T>(s), Err(e) if e == error_expected);
+    assert_eq!(serde_json5::from_str::<T>(s), Err(error_expected));
 }
 
 #[allow(unused)]
diff --git a/third_party/tests/de.rs b/third_party/tests/de.rs
index 7057faf..a8155b9 100644
--- a/third_party/tests/de.rs
+++ b/third_party/tests/de.rs
@@ -699,6 +699,7 @@
     }
 
     deserializes_to("'A'", E::A);
+    deserializes_to("{ A: null }", E::A);
     deserializes_to("{ B: 2 }", E::B(2));
     deserializes_to("{ C: [3, 5] }", E::C(3, 5));
     deserializes_to("{ D: { a: 7, b: 11 } }", E::D { a: 7, b: 11 });
@@ -712,6 +713,7 @@
     enum E {
         A {},
         B(),
+        C,
     }
 
     #[derive(Deserialize, PartialEq, Debug)]
@@ -721,9 +723,19 @@
 
     deserializes_with_error::<S>("{ e: 'A' }", make_error("expected an object", 1, 6));
     deserializes_with_error::<S>("{ e: 'B' }", make_error("expected an array", 1, 6));
+    deserializes_with_error::<S>("{ e: { 'A': 5 } }", make_error("expected an object", 1, 6));
+    deserializes_with_error::<S>("{ e: { 'B': 5 } }", make_error("expected an array", 1, 6));
+    deserializes_with_error::<S>(
+        "{ e: { 'C': 5 } }",
+        make_error("invalid type: integer `5`, expected unit", 1, 13),
+    );
+    deserializes_with_error::<S>(
+        "{ e: { 'C': {} } }",
+        make_error("invalid type: map, expected unit", 1, 13),
+    );
     deserializes_with_error::<E>(
-        "\n 'C'",
-        make_error("unknown variant `C`, expected `A` or `B`", 2, 2),
+        "\n 'D'",
+        make_error("unknown variant `D`, expected one of `A`, `B`, `C`", 2, 2),
     );
 }