Compare commits

...

2 commits

Author SHA1 Message Date
3b02faf9b4 [oden] It's a start 2023-06-20 06:33:29 -07:00
83a0950153 [oden-js] TryFromValue for Value 2023-06-20 06:17:34 -07:00
3 changed files with 55 additions and 15 deletions

View file

@ -1,4 +1,4 @@
use crate::{ContextRef, Error, Result, ValueRef}; use crate::{ContextRef, Error, Result, Value, ValueRef};
use std::num::TryFromIntError; use std::num::TryFromIntError;
pub trait TryFromValue: Sized { pub trait TryFromValue: Sized {
@ -98,10 +98,9 @@ impl TryFromValue for String {
} }
} }
// impl<'c, T: Class> TryFrom<&'c ValueRef<'_>> for T { impl TryFromValue for Value {
// #[inline]
// #[inline] fn try_from_value(value: &ValueRef, ctx: &ContextRef) -> Result<Self> {
// fn try_from_value(value: &ValueRef, ctx:&ContextRef) -> Result< Self> { Ok(value.dup(ctx))
// T::from_value(value) }
// } }
// }

View file

@ -1,4 +1,5 @@
function init() { function init() {
graphics.print("Hello world!");
// console.log("Hello world!"); // console.log("Hello world!");
} }

View file

@ -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 { pub struct ScriptContext {
context: js::Context, context: Context,
init: js::Value, init: Value,
update: js::Value, update: Value,
draw: js::Value, draw: Value,
} }
impl ScriptContext { impl ScriptContext {
pub fn new() -> Self { 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_bigfloat();
context.add_intrinsic_bigdecimal(); context.add_intrinsic_bigdecimal();
context.add_intrinsic_operators(); 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 js = include_str!("main.js");
let module = context let module = context
.load_module(js, "main.js") .load_module(js, "main.js")