use rlua::prelude::*;
use std::{
collections::HashMap,
env
};
pub fn init(lua: &Lua) -> crate::Result<()> {
let module = lua.create_table()?;
module.set("current_dir", lua.create_function( |_, _: ()| {
env::current_dir().map(|path| path.to_str().map(|s| s.to_string())).map_err(LuaError::external)
})? )?;
module.set("current_exe", lua.create_function( |_, _: ()| {
env::current_exe().map(|path| path.to_str().map(|s| s.to_string())).map_err(LuaError::external)
})? )?;
module.set("remove_var", lua.create_function( |_, var: String | {
Ok(env::remove_var(var))
})? )?;
module.set("set_current_dir", lua.create_function( |_, path: String| {
env::set_current_dir(path).map_err(LuaError::external)
})? )?;
module.set("set_var", lua.create_function( |_, (k, v): (String, String)| {
Ok(env::set_var(k, v))
})? )?;
module.set("var", lua.create_function( |_, k: String| {
env::var(k).map_err(LuaError::external)
})? )?;
module.set("vars", lua.create_function( |_, _: ()| {
//We are going to use "vars_os" due to the nature of "vars" when iterating over the list of variable that could result in a panic
let list: HashMap<String, String> = env::vars_os()
.into_iter()
.map(|(k, v)| (k.into_string().unwrap(), v.into_string().unwrap()))
.collect();
Ok(list)
})? )?;
lua.globals().set("env", module)?;
Ok(())
}