wren 0.1.12

Bindings to the Wren scripting language API
Documentation
#[macro_use]
extern crate wren;
#[macro_use]
extern crate lazy_static;

use std::collections::HashMap;
use wren::{VM, Configuration, ForeignMethodFn};

lazy_static!  {
    static ref FOREIGN_METHODS: HashMap<&'static str, ForeignMethodFn> = {
        let mut map = HashMap::new();
        map.insert("mainMathsin(_)s", wren_foreign_method_fn!(sin));
        map.insert("mainMathcos(_)s", wren_foreign_method_fn!(cos));
        map
    };
}

fn sin(vm: &mut VM) {
    let value = vm.get_slot_double(1).unwrap();
    vm.set_slot_double(0, value.sin());
}

fn cos(vm: &mut VM) {
    let value = vm.get_slot_double(1).unwrap();
    vm.set_slot_double(0, value.cos());
}

fn bind_method(_: &mut VM,
               module: &str,
               class_name: &str,
               is_static: bool,
               signature: &str)
               -> ForeignMethodFn {
    let full_signature = format!("{}{}{}{}",
                                 module,
                                 class_name,
                                 signature,
                                 if is_static { "s" } else { "" });
    *FOREIGN_METHODS.get::<str>(&full_signature).unwrap_or(&None)
}

fn main() {
    let source = r#"
class Math {
    foreign static sin(num)
    foreign static cos(num)
}
System.print("sin(1rad) = %(Math.sin(1))")
System.print("cos(1rad) = %(Math.cos(1))")
"#;
    let mut cfg = Configuration::new();
    cfg.set_bind_foreign_method_fn(wren_bind_foreign_method_fn!(bind_method));
    let mut vm = VM::new(cfg);
    vm.interpret(source);
}