JavaScriptから印刷する
fn main() {
js_sandbox::eval_json("console.log('Hello Rust from JS')").expect("JS runs");
}
JS関数を呼び出す
triple()
Rust から JavaScript 関数を呼び出す非常に基本的なアプリケーション。パラメータを渡し、戻り値を受け取ります。どちらも JSON 経由でシリアル化されます。
use js_sandbox::{Script, AnyError};
fn main() -> Result<(), AnyError> {
let js_code = "function sub(a, b) { return a - b; }";
let mut script = Script::from_string(js_code)?;
let result: i32 = script.call("sub", (7, 5))?;
assert_eq!(result, 2);
Ok(())
}
JSON オブジェクトをシリアル化し (Rust -> JS)、文字列をフォーマットする例 (JS -> Rust):
use js_sandbox::{Script, AnyError};
use serde::Serialize;
#[derive(Serialize)]
struct Person {
name: String,
age: u8,
}
fn main() -> Result<(), AnyError> {
let src = r#"
function toString(person) {
return "A person named " + person.name + " of age " + person.age;
}"#;
let mut script = Script::from_string(src)
.expect("Initialization succeeds");
let person = Person { name: "Roger".to_string(), age: 42 };
let result: String = script.call("toString", (person,)).unwrap();
assert_eq!(result, "A person named Roger of age 42");
Ok(())
}
JSファイルをロードする
use js_sandbox::Script;
fn main() {
let mut script = Script::from_file("script.js").expect("Load + init succeeds");
// or, at compile time:
let code: &'static str = include_str!("script.js");
let mut script = Script::from_string(code).expect("Init succeeds");
// use script as usual
}
ステートフル JS スクリプトを初期化し、関数を使用してその状態を時間の経過とともに変更できます。この例では、2 回の呼び出しで文字列を追加し、3 回目の呼び出しで結果を取得します。
use js_sandbox::{Script, AnyError};
fn main() -> Result<(), AnyError> {
let src = r#"
var total = '';
function append(str) { total += str; }
function get() { return total; }"#;
let mut script = Script::from_string(src)?;
let _: () = script.call("append", ("hello",))?;
let _: () = script.call("append", (" world",))?;
let result: String = script.call("get", ())?;
assert_eq!(result, "hello world");
Ok(())
}
タイムアウトを指定してスクリプトを呼び出す
JS コードには、Rust コードをブロックする長時間または永久に実行されるループが含まれる場合があります。JS スクリプトの実行が中止されるまでのタイムアウトを設定できます。
use js_sandbox::{Script, AnyError};
fn main() -> Result<(), AnyError> {
use std::time::Duration;
let js_code = "function run_forever() { for(;;){} }";
let mut script = Script::from_string(js_code)?
.with_timeout(Duration::from_millis(1000));
let result: Result<String, AnyError> = script.call("run_forever", ());
assert_eq!(
result.unwrap_err().to_string(),
"Uncaught Error: execution terminated".to_string()
);
Ok(())
}
プロジェクトの Cargo.toml ファイルに以下を追加します。
[dependencies]
js-sandbox="0.2.0-rc.0"