wlambda 0.3.0

WLambda is an embeddable scripting language for Rust
Documentation
use std::fs::File;
use regex::Regex;
use std::io::{BufRead, BufReader};

fn get_scripts_from_file(filename: &str) -> Vec<(String, String)> {
    let f = File::open(filename).expect("Open file");

    let rx = Regex::new("```wlambda").unwrap();
    let rx_end = Regex::new("```").unwrap();

    let mut code_snippets = Vec::new();

    let mut code_name = String::from("");
    let mut code      = String::from("");
    let mut in_code = false;
    for (lidx, l) in BufReader::new(f).lines().enumerate() {
        let line = l.unwrap();

        if in_code && rx_end.is_match(&line) {
            in_code = false;
            code_snippets.push((code_name, code));
            code_name = String::from("");
            code      = String::from("");

        } else if !in_code && rx.is_match(&line) {
            in_code = true;
            code_name = format!("{} line {}", filename, lidx + 1);

        } else if in_code {
            code += &line;
            code += "\n";
        }
    }

    code_snippets
}

fn execute_script(name: &str, snippet: &str) {
    use wlambda::prelude::create_wlamba_prelude;
    use wlambda::compiler::EvalContext;

    let lfmr =
        std::rc::Rc::new(
            std::cell::RefCell::new(
                wlambda::compiler::LocalFileModuleResolver::new()));

    let global = create_wlamba_prelude();
    global.borrow_mut().set_resolver(lfmr.clone());
    let mut ctx = EvalContext::new(global);
    match ctx.eval(snippet) {
        Ok(v) => { println!("result '{}': {}", name, v.s()); },
        Err(e) => {
            panic!(format!("Failed code snippet '{}': {}", name, e));
        }
    }
}

#[test]
fn main() {

    for (name, snip) in get_scripts_from_file("src/prelude.rs") {
        execute_script(&name, &snip);
    }

    for (name, snip) in get_scripts_from_file("src/parser.rs") {
        execute_script(&name, &snip);
    }

    for (name, snip) in get_scripts_from_file("src/compiler.rs") {
        execute_script(&name, &snip);
    }

    for (name, snip) in get_scripts_from_file("src/lib.rs") {
        execute_script(&name, &snip);
    }

    for (name, snip) in get_scripts_from_file("src/vval.rs") {
        execute_script(&name, &snip);
    }

    for (name, snip) in get_scripts_from_file("src/threads.rs") {
        execute_script(&name, &snip);
    }
}