Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - Added boa examples #1161

Closed
wants to merge 9 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/bors.yml
Original file line number Diff line number Diff line change
Expand Up @@ -126,16 +126,16 @@ jobs:
~/.cargo/git
~/.cargo/registry
key: ${{ runner.os }}-cargo-examples-${{ hashFiles('**/Cargo.lock') }}
- run: cd boa_examples
- name: Build examples
uses: actions-rs/cargo@v1
with:
command: build
args: --examples -v
- name: Run example classes
uses: actions-rs/cargo@v1
with:
command: run
args: --example classes
args: --bin classes

doc:
name: Documentation
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -130,16 +130,16 @@ jobs:
~/.cargo/git
~/.cargo/registry
key: ${{ runner.os }}-cargo-examples-${{ hashFiles('**/Cargo.lock') }}
- run: cd boa_examples
- name: Build examples
uses: actions-rs/cargo@v1
with:
command: build
args: --examples -v
- name: Run example classes
uses: actions-rs/cargo@v1
with:
command: run
args: --example classes
args: --bin classes

doc:
name: Documentation
Expand Down
9 changes: 9 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ members = [
"boa_tester",
"boa_unicode",
"boa_wasm",
"boa_examples",
jasonwilliams marked this conversation as resolved.
Show resolved Hide resolved
]

# The release profile, used for `cargo build --release`.
Expand Down
14 changes: 14 additions & 0 deletions boa_examples/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[package]
name = "boa_examples"
version = "0.11.0"
authors = ["boa-dev"]
repository = "https://github.com/boa-dev/boa"
license = "Unlicense/MIT"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
boa_engine = { path = "../boa_engine", features = ["console"] }
boa_gc = { path = "../boa_gc" }
gc = { version = "0.4.1" }
14 changes: 14 additions & 0 deletions boa_examples/scripts/calc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
module.exports = {
add: function (a, b) {
return a + b;
},
subtract: function (a, b) {
return a - b;
},
multiply: function (a, b) {
return a * b;
},
divide: function (a, b) {
return a / b;
},
};
8 changes: 8 additions & 0 deletions boa_examples/scripts/calctest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
//load module
let calc = require("./scripts/calc.js");

console.log("Using calc module");
console.log("Add: " + calc.add(3, 3));
console.log("Subtract: " + calc.subtract(3, 3));
console.log("Multiply: " + calc.multiply(3, 3));
console.log("Divide: " + calc.divide(3, 3));
11 changes: 11 additions & 0 deletions boa_examples/scripts/enhancedglobal.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
//access custom global variable
console.log("Custom global: " + customstring);

//call a custom global function with arguments
console.log("Custom function: " + rusty_hello("Boa! Boa!"));

//access a custom global object and call a member function of that object
let a = 5;
let b = 5;
let result = rusty_obj.add(a, b);
console.log("Custom object: Result from rusty_obj.add() : " + result);
1 change: 1 addition & 0 deletions boa_examples/scripts/helloworld.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
console.log("Hello World from JS file!");
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
// NOTE: this example requires the `console` feature to run correctly.

use boa_engine::{
class::{Class, ClassBuilder},
property::Attribute,
Context, JsResult, JsValue,
};

use boa_gc::{Finalize, Trace};

// We create a new struct that is going to represent a person.
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
// This example shows how to manipulate a Javascript array using Rust code.

use boa_engine::{
object::{FunctionBuilder, JsArray},
Context, JsValue,
Context, JsResult, JsValue,
};

fn main() -> Result<(), JsValue> {
fn main() -> JsResult<()> {
// We create a new `Context` to create a new Javascript executor.
let context = &mut Context::default();

Expand Down
28 changes: 28 additions & 0 deletions boa_examples/src/bin/loadfile.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// This example shows how to load, parse and execute JS code from a source file
// (./scripts/helloworld.js)

use std::fs::read_to_string;

use boa_engine::Context;

fn main() {
let js_file_path = "./scripts/helloworld.js";

match read_to_string(js_file_path) {
Ok(src) => {
// Instantiate the execution context
let mut context = Context::default();
// Parse the source code
match context.eval(src) {
Ok(res) => {
println!("{}", res.to_string(&mut context).unwrap());
}
Err(e) => {
// Pretty print the error
eprintln!("Uncaught {}", e.display());
}
};
}
Err(msg) => eprintln!("Error: {}", msg),
}
}
21 changes: 21 additions & 0 deletions boa_examples/src/bin/loadstring.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// This example loads, parses and executes a JS code string

use boa_engine::Context;

fn main() {
let js_code = "console.log('Hello World from a JS code string!')";

// Instantiate the execution context
let mut context = Context::default();

// Parse the source code
match context.eval(js_code) {
Ok(res) => {
println!("{}", res.to_string(&mut context).unwrap());
}
Err(e) => {
// Pretty print the error
eprintln!("Uncaught {}", e.display());
}
};
}
59 changes: 59 additions & 0 deletions boa_examples/src/bin/modulehandler.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// This example implements a custom module handler which mimics
// the require/module.exports pattern

use boa_engine::{prelude::JsObject, property::Attribute, Context, JsResult, JsValue};
use std::fs::read_to_string;

fn main() {
let js_file_path = "./scripts/calctest.js";
let buffer = read_to_string(js_file_path);

if buffer.is_err() {
println!("Error: {}", buffer.unwrap_err());
return;
}

// Creating the execution context
let mut ctx = Context::default();

// Adding custom implementation that mimics 'require'
ctx.register_global_function("require", 0, require);

// Adding custom object that mimics 'module.exports'
let moduleobj = JsObject::default();
moduleobj
.set("exports", JsValue::from(" "), false, &mut ctx)
.unwrap();
ctx.register_global_property("module", JsValue::from(moduleobj), Attribute::default());

// Instantiating the engine with the execution context
// Loading, parsing and executing the JS code from the source file
ctx.eval(&buffer.unwrap()).unwrap();
}

// Custom implementation that mimics the 'require' module loader
fn require(_: &JsValue, args: &[JsValue], ctx: &mut Context) -> JsResult<JsValue> {
let arg = args.get(0).unwrap();

// BUG: Dev branch seems to be passing string arguments along with quotes
let libfile = arg
.to_string(ctx)
.expect("Failed to convert to string")
.to_string();

// Read the module source file
println!("Loading: {}", libfile);
let buffer = read_to_string(libfile);
if let Err(..) = buffer {
println!("Error: {}", buffer.unwrap_err());
Ok(JsValue::Rational(-1.0))
} else {
// Load and parse the module source
ctx.eval(&buffer.unwrap()).unwrap();

// Access module.exports and return as ResultValue
let global_obj = ctx.global_object().to_owned();
let module = global_obj.get("module", ctx).unwrap();
module.as_object().unwrap().get("exports", ctx)
}
}