1
0
Эх сурвалжийг харах

Handle deserialize errors without panic (#2664)

* Handle deserialize errors rather than panic

* don't clone event data for deserialization in debug or release mode

---------

Co-authored-by: Evan Almloff <evanalmloff@gmail.com>
Wesley McCann 11 сар өмнө
parent
commit
5bdb147afd

+ 0 - 20
Cargo.lock

@@ -2835,7 +2835,6 @@ dependencies = [
  "rfd",
  "rustversion",
  "serde",
- "serde-value",
  "serde_json",
  "serde_repr",
  "tokio",
@@ -6757,15 +6756,6 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
 
-[[package]]
-name = "ordered-float"
-version = "2.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"
-dependencies = [
- "num-traits",
-]
-
 [[package]]
 name = "ordered-stream"
 version = "0.2.0"
@@ -8501,16 +8491,6 @@ dependencies = [
  "serde_derive",
 ]
 
-[[package]]
-name = "serde-value"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c"
-dependencies = [
- "ordered-float",
- "serde",
-]
-
 [[package]]
 name = "serde-wasm-bindgen"
 version = "0.5.0"

+ 1 - 3
packages/html/Cargo.toml

@@ -25,7 +25,6 @@ euclid = "0.22.7"
 enumset = "1.1.2"
 keyboard-types = { version = "0.7", default-features = false }
 async-trait = { version = "0.1.58", optional = true }
-serde-value = { version = "0.7.0", optional = true }
 tokio = { workspace = true, features = ["fs", "io-util"], optional = true }
 rfd = { version = "0.14", optional = true }
 futures-channel = { workspace = true }
@@ -72,8 +71,7 @@ serialize = [
     "dep:serde_repr",
     "euclid/serde",
     "keyboard-types/serde",
-    "dioxus-core/serialize",
-    "serde-value",
+    "dioxus-core/serialize"
 ]
 mounted = [
     "web-sys?/Element",

+ 13 - 20
packages/html/src/transit.rs

@@ -24,7 +24,7 @@ impl<'de> Deserialize<'de> for HtmlEvent {
             element: ElementId,
             name: String,
             bubbles: bool,
-            data: serde_value::Value,
+            data: serde_json::Value,
         }
 
         let Inner {
@@ -35,18 +35,15 @@ impl<'de> Deserialize<'de> for HtmlEvent {
         } = Inner::deserialize(deserializer)?;
 
         // in debug mode let's try and be helpful as to why the deserialization failed
-        #[cfg(debug_assertions)]
-        {
-            _ = deserialize_raw(&name, data.clone()).unwrap_or_else(|e| {
-                panic!(
-                    "Failed to deserialize event data for event {}:  {:#?}\n'{:#?}'",
-                    name, e, data,
-                )
-            });
-        }
+        let data = deserialize_raw(&name, &data).map_err(|e| {
+            serde::de::Error::custom(format!(
+                "Failed to deserialize event data for event {}:  {:#?}\n'{:#?}'",
+                name, e, data,
+            ))
+        })?;
 
         Ok(HtmlEvent {
-            data: deserialize_raw(&name, data).unwrap(),
+            data,
             element,
             bubbles,
             name,
@@ -55,15 +52,12 @@ impl<'de> Deserialize<'de> for HtmlEvent {
 }
 
 #[cfg(feature = "serialize")]
-fn deserialize_raw(
-    name: &str,
-    data: serde_value::Value,
-) -> Result<EventData, serde_value::DeserializerError> {
+fn deserialize_raw(name: &str, data: &serde_json::Value) -> Result<EventData, serde_json::Error> {
     use EventData::*;
 
     // a little macro-esque thing to make the code below more readable
     #[inline]
-    fn de<'de, F>(f: serde_value::Value) -> Result<F, serde_value::DeserializerError>
+    fn de<'de, F>(f: &'de serde_json::Value) -> Result<F, serde_json::Error>
     where
         F: Deserialize<'de>,
     {
@@ -134,10 +128,9 @@ fn deserialize_raw(
 
         // OtherData => "abort" | "afterprint" | "beforeprint" | "beforeunload" | "hashchange" | "languagechange" | "message" | "offline" | "online" | "pagehide" | "pageshow" | "popstate" | "rejectionhandled" | "storage" | "unhandledrejection" | "unload" | "userproximity" | "vrdisplayactivate" | "vrdisplayblur" | "vrdisplayconnect" | "vrdisplaydeactivate" | "vrdisplaydisconnect" | "vrdisplayfocus" | "vrdisplaypointerrestricted" | "vrdisplaypointerunrestricted" | "vrdisplaypresentchange";
         other => {
-            return Err(serde_value::DeserializerError::UnknownVariant(
-                other.to_string(),
-                &[],
-            ))
+            return Err(serde::de::Error::custom(format!(
+                "Unknown event type: {other}"
+            )))
         }
     };