Skip to content
Snippets Groups Projects
run_script.rs 1.05 KiB
Newer Older
Louis's avatar
Louis committed
use std::convert::AsRef;
use std::path::Path;
use std::fs::File;
use std::io::Read;
Louis's avatar
Louis committed
use rlua::{Lua, UserData};
use scripting::ScriptResponse;
use std::collections::HashMap;
Louis's avatar
Louis committed

pub fn run_script<P: AsRef<Path>>(path: P, mut lua: &Lua, params: HashMap<String, String>) -> Option<ScriptResponse> {
Louis's avatar
Louis committed
    let mut file = File::open(&path).unwrap();
    let mut buf = String::new();

Louis's avatar
Louis committed
    match file.read_to_string(&mut buf) {
		Ok(_) => {},
		Err(_) => return None,
	}

Louis's avatar
Louis committed
	let file_name = path.as_ref()
		.file_name()
		.and_then(|name| name.to_str());
	let params_table = serialize_table("params", params);

	lua.eval::<ScriptResponse>(&format!("{}\n{}", params_table, buf), file_name)
		.map_err(|e| println!("{}", e))
		.ok()
}

fn serialize_table(name: &'static str, table: HashMap<String, String>) -> String {
	let mut output = format!("local {} = {{", name);

	let contents = table.iter()
		.fold(
			String::new(),
			|acc, (key, value)| format!("{} {} = \"{}\",", acc, key, value)
		);
	output.push_str(&contents[0..contents.len() - 1]);
	output.push_str(" }");