goscript-engine 0.1.0

goscript engine
Documentation
use goscript_vm::ffi::{Ffi, FfiResult};
use goscript_vm::value::GosValue;
use std::cell::RefCell;
use std::rc::Rc;

pub struct Fmt {}

impl Ffi for Fmt {
    fn call(&self, func_name: &str, params: Vec<GosValue>) -> Vec<GosValue> {
        match func_name {
            "println" => self.println(params),
            "printf" => self.printf(params),
            _ => unreachable!(),
        }
        vec![]
    }
}

impl Fmt {
    pub fn new(_v: Vec<GosValue>) -> FfiResult<Rc<RefCell<dyn Ffi>>> {
        Ok(Rc::new(RefCell::new(Fmt {})))
    }

    fn println(&self, params: Vec<GosValue>) {
        let vec = params[0].as_slice().0.get_vec();
        let strs: Vec<String> = vec
            .iter()
            .map(|x| {
                if x.is_nil() {
                    "<nil>".to_string()
                } else {
                    x.iface_underlying().unwrap().to_string()
                }
            })
            .collect();
        println!("{}", strs.join(", "));
    }

    fn printf(&self, params: Vec<GosValue>) {
        let _vec = params[0].as_slice().0.get_vec();
        unimplemented!();
    }
}