1extern crate log;
2use easy_error::{Error, bail};
3use lazy_static::lazy_static;
4use std::collections::HashMap;
5use std::sync::Mutex;
6
7pub mod bundcore;
8pub mod bundvm;
9pub mod bundcore_eval;
10pub mod bundcore_run;
11pub mod bundcore_display;
12pub mod bundcore_init_stdlib;
13pub mod bundcore_vm_bootstrap;
14pub mod bundcore_vm_ephemeral;
15
16pub mod common;
17pub mod common_get_data;
18
19pub type BundInitFn = fn(&mut bundcore::Bund) -> Result<&mut bundcore::Bund, Error>;
20
21lazy_static! {
22 pub static ref STDLIB: Mutex<HashMap<String, BundInitFn>> = {
23 let s: Mutex<HashMap<String, BundInitFn>> = Mutex::new(HashMap::new());
24 s
25 };
26}
27
28pub fn add_stdlib<N: AsRef<str> + ToString + std::fmt::Display>(name: N, fun: BundInitFn) -> Result<(), Error> {
29 let mut stdlib = match STDLIB.lock() {
30 Ok(stdlib) => stdlib,
31 Err(err) => {
32 log::error!("Error locking standard library handler");
33 bail!("{}", err);
34 }
35 };
36 let _ = stdlib.insert(name.to_string(), fun);
37 drop(stdlib);
38 Ok(())
39}
40
41pub fn version() -> String {
42 env!("CARGO_PKG_VERSION").to_string().clone()
43}