Merge pull request #898 from Demonthos/make-use-eval-web-Rc

Make web and desktop use_eval compatible
This commit is contained in:
Jon Kelley authored and GitHub committed 2023-06-30 12:15:22 -07:00
commit e3b4021d34
1 file changed
+16 -18
+16 -18
View File
@@ -2,6 +2,7 @@
use std::{ use std::{
future::{IntoFuture, Ready}, future::{IntoFuture, Ready},
rc::Rc,
str::FromStr, str::FromStr,
}; };
@@ -22,29 +23,26 @@ use serde_json::Value;
/// ///
/// The closure will panic if the provided script is not valid JavaScript code /// The closure will panic if the provided script is not valid JavaScript code
/// or if it returns an uncaught error. /// or if it returns an uncaught error.
pub fn use_eval<S: std::string::ToString>(cx: &ScopeState) -> &dyn Fn(S) -> EvalResult { pub fn use_eval(cx: &ScopeState) -> &Rc<dyn Fn(String) -> EvalResult> {
cx.use_hook(|| { cx.use_hook(|| {
|script: S| { Rc::new(|script: String| EvalResult {
let body = script.to_string(); value: if let Ok(value) =
EvalResult { js_sys::Function::new_no_args(&script).call0(&wasm_bindgen::JsValue::NULL)
value: if let Ok(value) = {
js_sys::Function::new_no_args(&body).call0(&wasm_bindgen::JsValue::NULL) if let Ok(stringified) = js_sys::JSON::stringify(&value) {
{ if !stringified.is_undefined() && stringified.is_valid_utf16() {
if let Ok(stringified) = js_sys::JSON::stringify(&value) { let string: String = stringified.into();
if !stringified.is_undefined() && stringified.is_valid_utf16() { Value::from_str(&string)
let string: String = stringified.into();
Value::from_str(&string)
} else {
Err(serde_json::Error::custom("Failed to stringify result"))
}
} else { } else {
Err(serde_json::Error::custom("Failed to stringify result")) Err(serde_json::Error::custom("Failed to stringify result"))
} }
} else { } else {
Err(serde_json::Error::custom("Failed to execute script")) Err(serde_json::Error::custom("Failed to stringify result"))
}, }
} } else {
} Err(serde_json::Error::custom("Failed to execute script"))
},
}) as Rc<dyn Fn(String) -> EvalResult>
}) })
} }