bundcore 0.7.0

BUND programming language API
Documentation
extern crate log;
use easy_error::{Error, bail};
use lazy_static::lazy_static;
use std::collections::HashMap;
use std::sync::Mutex;

pub mod bundcore;
pub mod bundvm;
pub mod bundcore_eval;
pub mod bundcore_run;
pub mod bundcore_display;
pub mod bundcore_init_stdlib;
pub mod bundcore_vm_bootstrap;
pub mod bundcore_vm_ephemeral;

pub mod common;
pub mod common_get_data;

pub type BundInitFn  = fn(&mut bundcore::Bund) -> Result<&mut bundcore::Bund, Error>;

lazy_static! {
    pub static ref STDLIB: Mutex<HashMap<String, BundInitFn>> = {
        let s: Mutex<HashMap<String, BundInitFn>> = Mutex::new(HashMap::new());
        s
    };
}

pub fn add_stdlib<N: AsRef<str> + ToString + std::fmt::Display>(name: N, fun: BundInitFn) -> Result<(), Error> {
    let mut stdlib = match STDLIB.lock() {
        Ok(stdlib) => stdlib,
        Err(err) => {
            log::error!("Error locking standard library handler");
            bail!("{}", err);
        }
    };
    let _ = stdlib.insert(name.to_string(), fun);
    drop(stdlib);
    Ok(())
}

pub fn version() -> String {
    env!("CARGO_PKG_VERSION").to_string().clone()
}