use boa::{
gc::{Finalize, Trace},
object::{FunctionBuilder, JsObject},
property::{Attribute, PropertyDescriptor},
Context, JsString, JsValue,
};
fn main() -> Result<(), JsValue> {
let mut context = Context::new();
let variable = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1;
context.register_global_closure("closure", 0, move |_, _, _| {
println!("Called `closure`");
println!("variable = {}", variable);
Ok(JsValue::new(variable))
})?;
assert_eq!(context.eval("closure()")?, 255.into());
#[derive(Debug, Clone, Trace, Finalize)]
struct BigStruct {
greeting: JsString,
object: JsObject,
}
let object = context.construct_object();
object.define_property_or_throw(
"name",
PropertyDescriptor::builder()
.value("Boa dev")
.writable(false)
.enumerable(false)
.configurable(false),
&mut context,
)?;
let clone_variable = BigStruct {
greeting: JsString::from("Hello from Javascript!"),
object,
};
let js_function = FunctionBuilder::closure_with_captures(
&mut context,
|_, _, context, captures| {
println!("Called `createMessage`");
let name = captures.object.get("name", context)?;
let message = JsString::concat_array(&[
"message from `",
name.to_string(context)?.as_str(),
"`: ",
captures.greeting.as_str(),
]);
println!("{}", message);
Ok(message.into())
},
clone_variable,
)
.name("createMessage")
.build();
context.register_global_property(
"createMessage",
js_function,
Attribute::WRITABLE | Attribute::NON_ENUMERABLE | Attribute::CONFIGURABLE,
);
assert_eq!(
context.eval("createMessage()")?,
"message from `Boa dev`: Hello from Javascript!".into()
);
Ok(())
}