diff --git a/oden-js/src/conversion/from.rs b/oden-js/src/conversion/from.rs index 4d12e776..d7a6acb4 100644 --- a/oden-js/src/conversion/from.rs +++ b/oden-js/src/conversion/from.rs @@ -1,4 +1,4 @@ -use crate::{ContextRef, Error, Result, ValueRef}; +use crate::{ContextRef, Error, Result, Value, ValueRef}; use std::num::TryFromIntError; pub trait TryFromValue: Sized { @@ -98,10 +98,9 @@ impl TryFromValue for String { } } -// impl<'c, T: Class> TryFrom<&'c ValueRef<'_>> for T { -// -// #[inline] -// fn try_from_value(value: &ValueRef, ctx:&ContextRef) -> Result< Self> { -// T::from_value(value) -// } -// } +impl TryFromValue for Value { + #[inline] + fn try_from_value(value: &ValueRef, ctx: &ContextRef) -> Result { + Ok(value.dup(ctx)) + } +} 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")