use std::path::PathBuf;
use std::result::Result as StdResult;
use mlua::{Lua, Result, Table};
pub fn current_dir(_lua: &Lua, _: ()) -> Result<StdResult<PathBuf, String>> {
let dir = lua_try!(std::env::current_dir());
Ok(Ok(dir))
}
pub fn set_current_dir(_lua: &Lua, path: String) -> Result<StdResult<bool, String>> {
lua_try!(std::env::set_current_dir(path));
Ok(Ok(true))
}
pub fn current_exe(_lua: &Lua, _: ()) -> Result<StdResult<PathBuf, String>> {
let exe = lua_try!(std::env::current_exe());
Ok(Ok(exe))
}
pub fn home_dir(_lua: &Lua, _: ()) -> Result<Option<PathBuf>> {
Ok(std::env::home_dir())
}
pub fn var(_lua: &Lua, key: String) -> Result<Option<String>> {
Ok(std::env::var(key).ok())
}
pub fn vars(lua: &Lua, _: ()) -> Result<Table> {
lua.create_table_from(std::env::vars())
}
pub fn set_var(_lua: &Lua, (key, value): (String, Option<String>)) -> Result<()> {
match value {
Some(v) => unsafe { std::env::set_var(key, v) },
None => unsafe { std::env::remove_var(key) },
}
Ok(())
}
fn loader(lua: &Lua) -> Result<Table> {
let t = lua.create_table()?;
t.set("current_dir", lua.create_function(current_dir)?)?;
t.set("set_current_dir", lua.create_function(set_current_dir)?)?;
t.set("current_exe", lua.create_function(current_exe)?)?;
t.set("home_dir", lua.create_function(home_dir)?)?;
t.set("var", lua.create_function(var)?)?;
t.set("vars", lua.create_function(vars)?)?;
t.set("set_var", lua.create_function(set_var)?)?;
t.set("ARCH", std::env::consts::ARCH)?;
t.set("FAMILY", std::env::consts::FAMILY)?;
t.set("OS", std::env::consts::OS)?;
Ok(t)
}
pub fn register(lua: &Lua, name: Option<&str>) -> Result<Table> {
let name = name.unwrap_or("@env");
let value = loader(lua)?;
lua.register_module(name, &value)?;
Ok(value)
}