extern crate rurust;
extern crate mri_sys as ffi;

use std::io::Write;

#[no_mangle]
extern fn do_rust_thing() {
    println!("from rust");
}

fn main() {
    let mut vm = if let Ok(vm) = rurust::VM::new() {
        vm
    } else {
        println!("could not create VM");
        return;
    };

    loop {
        let mut line = String::new();

        print!("> ");
        std::io::stdout().flush().unwrap();
        std::io::stdin().read_line(&mut line).unwrap();
        line = line.trim().to_owned();

        if line == "exit" || line == "quit" {
            break;
        }


        let a = vm.class("Abc").
            method("thing", do_rust_thing as *const _, 0).
            build();

        match vm.eval(&line) {
            Ok(a) => {
                println!("=> {}", a);
            },
            Err(rurust::ErrorKind::Exception(ref value)) => {
                let ty = value.class();
                println!("{}: {}", ty, value);
                continue;
            },
            Err(rurust::ErrorKind::VM(ref message)) => {
                println!("Internal VM error: {}", message);
                return;
            },
        };
    }
}