summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiacomo Rizzi <gufoes@gmail.com>2021-11-22 14:47:29 +0100
committerGitHub <noreply@github.com>2021-11-22 14:47:29 +0100
commit86e52383846eae407787c145e3e8cf09354f2a08 (patch)
tree71ab06c491cb9fcfa2a6427f9ff1d1a8b34fa45d
parentf6d04bfe7027e89e449085509cb56f6b33b35b69 (diff)
core(examples): Deserialize the result of execute_script (#12806)
Example of transforming execute_script response to a serde_json::Value Co-authored-by: Bartek IwaƄczuk <biwanczuk@gmail.com>
-rw-r--r--core/examples/eval_js_value.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/core/examples/eval_js_value.rs b/core/examples/eval_js_value.rs
new file mode 100644
index 000000000..682cbc608
--- /dev/null
+++ b/core/examples/eval_js_value.rs
@@ -0,0 +1,48 @@
+// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
+//! This example shows you how to evaluate JavaScript expression and deserialize
+//! return value into a Rust object.
+
+// NOTE:
+// Here we are deserializing to `serde_json::Value` but you can
+// deserialize to any other type that implementes the `Deserialize` trait.
+
+use deno_core::v8;
+use deno_core::JsRuntime;
+use deno_core::RuntimeOptions;
+
+fn main() {
+ let mut runtime = JsRuntime::new(RuntimeOptions::default());
+
+ // Evaluate some code
+ let code = "let a = 1+4; a*2";
+ let output: serde_json::Value =
+ eval(&mut runtime, code).expect("Eval failed");
+
+ println!("Output: {:?}", output);
+
+ let expected_output = serde_json::json!(10);
+ assert_eq!(expected_output, output);
+}
+
+fn eval(
+ context: &mut JsRuntime,
+ code: &str,
+) -> Result<serde_json::Value, String> {
+ let res = context.execute_script("<anon>", code);
+ match res {
+ Ok(global) => {
+ let scope = &mut context.handle_scope();
+ let local = v8::Local::new(scope, global);
+ // Deserialize a `v8` object into a Rust type using `serde_v8`,
+ // in this case deserialize to a JSON `Value`.
+ let deserialized_value =
+ serde_v8::from_v8::<serde_json::Value>(scope, local);
+
+ match deserialized_value {
+ Ok(value) => Ok(value),
+ Err(err) => Err(format!("Cannot deserialize value: {:?}", err)),
+ }
+ }
+ Err(err) => Err(format!("Evaling error: {:?}", err)),
+ }
+}