diff --git a/src/main.js b/src/main.js index 7b985b1f..1e9fa198 100644 --- a/src/main.js +++ b/src/main.js @@ -1,4 +1,5 @@ function init() { + graphics.print("Hello world!"); // console.log("Hello world!"); } diff --git a/src/script.rs b/src/script.rs index 4391e0d2..16bdd7a5 100644 --- a/src/script.rs +++ b/src/script.rs @@ -1,21 +1,61 @@ -use oden_js as js; +use oden_js::{Class, ClassID, Context, ContextRef, Runtime, Value, ValueRef, ValueResult}; + +pub struct GraphicsAPI {} + +impl GraphicsAPI { + fn print_fn(ctx: &ContextRef, _this: &ValueRef, args: &[&ValueRef]) -> ValueResult { + for arg in args { + print!("{}", arg.to_string(ctx)?); + } + println!(); + Ok(Value::undefined(ctx)) + } +} + +impl Class for GraphicsAPI { + fn class_id() -> &'static ClassID { + static ID: ClassID = ClassID::new("GraphicsAPI"); + &ID + } + + fn prototype(context: &ContextRef) -> ValueResult { + let mut prototype = context.new_object()?; + + let print = context.new_dynamic_fn(GraphicsAPI::print_fn)?; + prototype.set_property(context, "print", &print)?; + + Ok(prototype) + } +} pub struct ScriptContext { - context: js::Context, - init: js::Value, - update: js::Value, - draw: js::Value, + context: Context, + init: Value, + update: Value, + draw: Value, } impl ScriptContext { pub fn new() -> Self { - let runtime = js::Runtime::new(); + let runtime = Runtime::new(); - let mut context = js::Context::new(runtime); + let mut context = Context::new(runtime); context.add_intrinsic_bigfloat(); context.add_intrinsic_bigdecimal(); context.add_intrinsic_operators(); + // TODO: This should be a module instead. Yuck. + let mut global = context + .global_object() + .expect("Unable to get global object"); + let graphics = GraphicsAPI {}; + let graphics = graphics + .into_value(&context) + .expect("Unable to wrap graphics API"); + global + .set_property(&context, "graphics", &graphics) + .expect("Unable to establish graphics"); + let js = include_str!("main.js"); let module = context .load_module(js, "main.js")