Browse Source

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

Make web and desktop use_eval compatible
Jon Kelley 2 năm trước cách đây
mục cha
commit
e3b4021d34
1 tập tin đã thay đổi với 16 bổ sung18 xóa
  1. 16 18
      packages/web/src/util.rs

+ 16 - 18
packages/web/src/util.rs

@@ -2,6 +2,7 @@
 
 use std::{
     future::{IntoFuture, Ready},
+    rc::Rc,
     str::FromStr,
 };
 
@@ -22,29 +23,26 @@ use serde_json::Value;
 ///
 /// The closure will panic if the provided script is not valid JavaScript code
 /// 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(|| {
-        |script: S| {
-            let body = script.to_string();
-            EvalResult {
-                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() {
-                            let string: String = stringified.into();
-                            Value::from_str(&string)
-                        } else {
-                            Err(serde_json::Error::custom("Failed to stringify result"))
-                        }
+        Rc::new(|script: String| EvalResult {
+            value: if let Ok(value) =
+                js_sys::Function::new_no_args(&script).call0(&wasm_bindgen::JsValue::NULL)
+            {
+                if let Ok(stringified) = js_sys::JSON::stringify(&value) {
+                    if !stringified.is_undefined() && stringified.is_valid_utf16() {
+                        let string: String = stringified.into();
+                        Value::from_str(&string)
                     } else {
                         Err(serde_json::Error::custom("Failed to stringify result"))
                     }
                 } 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>
     })
 }