use super::*;
use std::env;
use std::path::PathBuf;
use std::process;
use std::sync::Arc;
pub struct Os;
impl Module for Os {
fn load(&self, state: &mut State) -> Result<(), LuaError> {
let module = state.lua.create_table()?;
module.set(
"exec",
state
.lua
.create_function(|lua, (name, args): (String, Vec<String>)| {
let path = PathBuf::from(&name);
let exec = if path.try_exists().is_ok() || path.is_absolute() {
path
} else {
match urs::misc::search_in_path(&name) {
Some(p) => p,
None => return Err(LuaError::runtime("Executable not found")),
}
};
let output = match process::Command::new(exec).args(args).output() {
Ok(o) => o,
Err(e) => return Err(LuaError::external(Arc::new(e))),
};
match String::from_utf8(output.stdout) {
Ok(string) => Ok(string.trim().into_lua(lua)?),
Err(e) => Err(LuaError::external(Arc::new(e))),
}
})?,
)?;
module.set(
"get_pid",
state
.lua
.create_function(|_, _: ()| Ok(std::process::id()))?,
)?;
module.set(
"get_env",
state
.lua
.create_function(|lua, name: String| match env::var(name) {
Ok(v) => Ok(v.into_lua(lua)?),
Err(_) => Ok(LuaValue::Nil),
})?,
)?;
module.set(
"current_exe",
state
.lua
.create_function(|lua, _: ()| match env::current_exe() {
Ok(p) => Ok(p.into_lua(lua)?),
Err(e) => Err(LuaError::external(Arc::new(e))),
})?,
)?;
module.set(
"get_cwd",
state
.lua
.create_function(|lua, _: ()| match env::current_dir() {
Ok(p) => Ok(p.into_lua(lua)?),
Err(_) => Ok(LuaValue::Nil),
})?,
)?;
module.set(
"set_cwd",
state.lua.create_function(|_, p: PathBuf| {
env::set_current_dir(p)?;
Ok(())
})?,
)?;
create_module(&state.lua, "autosway.os", module)?;
Ok(())
}
}