From 5bdb147afd4e61e04293b58634d8ac44ead82bab Mon Sep 17 00:00:00 2001 From: Wesley McCann Date: Mon, 22 Jul 2024 13:20:15 -0400 Subject: [PATCH] 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 --- Cargo.lock | 20 -------------------- packages/html/Cargo.toml | 4 +--- packages/html/src/transit.rs | 33 +++++++++++++-------------------- 3 files changed, 14 insertions(+), 43 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f02ee5ad7..d5f37941e 100644 --- a/Cargo.lock +++ b/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" diff --git a/packages/html/Cargo.toml b/packages/html/Cargo.toml index bc6cfb063..0ae134fdf 100644 --- a/packages/html/Cargo.toml +++ b/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", diff --git a/packages/html/src/transit.rs b/packages/html/src/transit.rs index 867313750..32b33620c 100644 --- a/packages/html/src/transit.rs +++ b/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 { +fn deserialize_raw(name: &str, data: &serde_json::Value) -> Result { use EventData::*; // a little macro-esque thing to make the code below more readable #[inline] - fn de<'de, F>(f: serde_value::Value) -> Result + fn de<'de, F>(f: &'de serde_json::Value) -> Result 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}" + ))) } };