Comments (3)
That looks reasonable, although note that Box<dyn std::error::Error>
will be still prone to the same problem with erased backtrace (since it's an erased generic Rust error type).
Maybe store actual serde_wasm_bindgen::Error
there instead?
Also note that you can use cfg
on enum branches so the whole thing might be simplified to:
#[derive(Debug, Error)]
pub enum MyError {
#[cfg(target_arch = "wasm32")]
SerdeWasmBindgen(serde_wasm_bindgen::Error),
// ...regular errors
}
This should also let Rust automatically implement Send
on your error enum when possible (non-wasm32 targets), and !Send
when not (wasm32) instead of you overriding it via manual unsafe impl
.
from serde-wasm-bindgen.
In general, JsError / JsValue-based error is more useful in Wasm-related code because it creates a JS error with .stack
correctly tracked by the JS engine and associated with the original thrown location inside Wasm. Rust backtraces can't provide that level of detail in Wasm, so creating errors from string at the last stage makes them much less useful for actual debugging.
That's why I prefer to do the opposite and convert JsError to string only when I really want to go from JS error to a Rust error and I'm okay with stripping the backtrace.
Most of the time, you also use serde-wasm-bindgen at the top level of the function exposed via #[wasm_bindgen]
anyway, so as long as you're propagating it immediately to Result<..., JsValue>
, the fact that JS values are not thread-safe shouldn't be a problem.
I wonder what your usecase is where this doesn't work.
from serde-wasm-bindgen.
In general, JsError / JsValue-based error is more useful in Wasm-related code because it creates a JS error with
.stack
correctly tracked by the JS engine and associated with the original thrown location inside Wasm. Rust backtraces can't provide that level of detail in Wasm, so creating errors from string at the last stage makes them much less useful for actual debugging.
That does indeed make a lot of sense!
I'm working on a cross-platform project that among several native targets also supports the web via wasm.
We're basically wrapping individual errors into a wrapper-enum
error type in order to provide more fine-grained internal error-handling via thiserror
.
It looks like I managed to make things work with this change:
Before:
#[derive(Debug, Error)]
pub enum MyError {
SerdeWasmBindgen(Box<dyn std::error::Error + Send>),
// ...
}
#[cfg(not(target_arch = "wasm32"))]
unsafe impl Send for MyError {}
After:
#[cfg(target_arch = "wasm32")]
type BoxedStdError = Box<dyn std::error::Error>;
#[cfg(not(target_arch = "wasm32"))]
type BoxedStdError = Box<dyn std::error::Error + Send>;
#[derive(Debug, Error)]
pub enum MyError {
SerdeWasmBindgen(BoxedStdError),
// ...
}
#[cfg(not(target_arch = "wasm32"))]
unsafe impl Send for MyError {}
from serde-wasm-bindgen.
Related Issues (20)
- Add support for serializing and deserializing JsValue? HOT 20
- https://www.covid19.admin.ch/en/epidemiologic/case/d/geo-regions?geoDate=2022-02-02 HOT 1
- ReferenceType integration? HOT 1
- WASM Reference Types HOT 2
- Add support for serializing `Closure`s HOT 1
- Internally tagged enumerations cannot deserialize byte buffers HOT 2
- `serde-wasm-bindgen` doesn't handle `serde(deny_unknown_fields)` properly HOT 3
- as_bytes() does not work if self is an Array HOT 3
- Better interop between Tauri and serde-wasm-bindgen HOT 1
- Produce Object instead of Map when converting to JsValue HOT 2
- Hitting an unreachable! panic in serializing HOT 5
- Structures containing usize seems to create BigInt dependency in generated JavaScript bindings HOT 4
- json_compatible Deserializer HOT 1
- IntoWasmAbi HOT 3
- Preserved value de-serialization error HOT 8
- [improvement] Allow overriding default serializer used in to_value HOT 1
- `js_sys::Function` is not serialized correctly HOT 2
- Can't figure out how to get Option<js_sys::Date> to work when serializing to JS HOT 11
- #[serde(alias = "somename")] stopped working after 0.6 HOT 15
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from serde-wasm-bindgen.