bundcore 0.7.0

BUND programming language API
Documentation
extern crate log;
use crate::bundcore::*;
use crate::{BundInitFn, STDLIB};
use easy_error::{Error, bail};

impl Bund {
    pub fn init_stdlib(&mut self, name: String, fun: BundInitFn) -> Result<&mut Bund, Error> {
        match fun(self) {
            Ok(_) => {
                log::debug!("BUND standard library {} initialized for {}", &name, self.id);
            },
            Err(err) => {
                log::error!("BUND standard library {} initialized failed for {}", &name, self.id);
                bail!("STDLIB init failed: {}", err);
            }
        }
        Ok(self)
    }

    pub fn init_lib(&mut self) -> Result<&mut Bund, Error> {
        let stdlib = match STDLIB.lock() {
            Ok(stdlib) => stdlib,
            Err(err) => {
                bail!("Error locking STDLIB handler for Bund: {}", err);
            }
        };
        for name in stdlib.clone().into_keys().collect::<Vec<_>>() {
            let fun = match stdlib.get(&name) {
                Some(fun) => fun,
                None => bail!("Error getting init function for: {}", &name),
            };
            match self.init_stdlib(name.clone(), *fun) {
                Ok(_) => {},
                Err(err) => {
                    drop(stdlib);
                    bail!("Error initializing library {}: {}", name.clone(), err);
                }
            }
        }
        drop(stdlib);
        Ok(self)
    }

    pub fn run_bootstrap(&mut self, name: String, script: String) -> Result<&mut Bund, Error> {
        match self.eval(script) {
            Ok(_) => {
                log::debug!("BUND instance bootstrapped {} for {}", &name, self.id);
            },
            Err(err) => {
                log::error!("BUND bootstrap {} initialized failed for {}", &name, self.id);
                bail!("BOOTSTRAP failed: {}", err);
            }
        }
        Ok(self)
    }
}