extern crate qjs_ng;
extern crate qjs_ng_sys;

use std::ffi::CStr;

use qjs_ng::value::Runtime;
use qjs_ng_sys::{JS_Eval, JS_NewContext, JS_NewRuntime, JS_EVAL_TYPE_GLOBAL};
fn add(a: i32, b: i32) -> i32 {
    // println!("add from rs: {} {}", a, b);
    a + b
}

fn print(s: String) -> i32 {
    println!("print rs: {}", s);
    s.len() as i32
}

fn inc(a: i32) -> i32 {
    println!("inc: {}", a);
    add(a, 1)
}
fn main() {
    let rt = Runtime::new();
    let ctx = rt.new_context();

    let code = r#"
        let c = add(1, 2);
        print('js: '+ c +"");
        print('js: '+ inc(c) +"");
        "#;
    //   ctx.add_callback("add", add);
    //   ctx.add_callback("inc", inc);
    //   ctx.add_callback("print", print);

    ctx.add_callback("add", add);
    ctx.add_callback("inc", inc);
    ctx.add_callback("print", print);

     ctx.eval(code, "<test.js>", 0 as i32);
}