diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/examples/eval_js_value.rs | 48 |
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)), + } +} |