|
|
@ -5,6 +5,7 @@ use std::{
|
|
|
|
|
|
|
|
|
|
|
|
use mlua::{Function, Lua, LuaSerdeExt, Result, Table};
|
|
|
|
use mlua::{Function, Lua, LuaSerdeExt, Result, Table};
|
|
|
|
use serde::Serialize;
|
|
|
|
use serde::Serialize;
|
|
|
|
|
|
|
|
use which::which;
|
|
|
|
|
|
|
|
|
|
|
|
/// Utility functions
|
|
|
|
/// Utility functions
|
|
|
|
pub fn utils_module(lua: &Lua) -> Result<Table> {
|
|
|
|
pub fn utils_module(lua: &Lua) -> Result<Table> {
|
|
|
@ -17,6 +18,7 @@ pub fn utils_module(lua: &Lua) -> Result<Table> {
|
|
|
|
exports.set("load_toml", lua.create_function(lua_load_toml)?)?;
|
|
|
|
exports.set("load_toml", lua.create_function(lua_load_toml)?)?;
|
|
|
|
exports.set("ext", lua.create_function(lua_ext)?)?;
|
|
|
|
exports.set("ext", lua.create_function(lua_ext)?)?;
|
|
|
|
exports.set("ext_piped", lua.create_function(lua_ext_piped)?)?;
|
|
|
|
exports.set("ext_piped", lua.create_function(lua_ext_piped)?)?;
|
|
|
|
|
|
|
|
exports.set("which", lua.create_function(lua_which)?)?;
|
|
|
|
|
|
|
|
|
|
|
|
if let Ok(nu_path) = which::which("nu") {
|
|
|
|
if let Ok(nu_path) = which::which("nu") {
|
|
|
|
exports.set(
|
|
|
|
exports.set(
|
|
|
@ -50,7 +52,7 @@ fn lua_merge<'a>(lua: &'a Lua, (a, b): (mlua::Value, mlua::Value)) -> Result<mlu
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Parse a json string into a lua value
|
|
|
|
/// Parse a json string into a lua value
|
|
|
|
fn lua_from_json<'a>(lua: &'a Lua, json_string: String) -> Result<mlua::Value<'a>> {
|
|
|
|
fn lua_from_json(lua: &Lua, json_string: String) -> Result<mlua::Value<'_>> {
|
|
|
|
let toml_value: serde_json::Value =
|
|
|
|
let toml_value: serde_json::Value =
|
|
|
|
serde_json::from_str(&json_string).map_err(mlua::Error::external)?;
|
|
|
|
serde_json::from_str(&json_string).map_err(mlua::Error::external)?;
|
|
|
|
|
|
|
|
|
|
|
@ -58,26 +60,31 @@ fn lua_from_json<'a>(lua: &'a Lua, json_string: String) -> Result<mlua::Value<'a
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Reads a json file and parses it as a lua value
|
|
|
|
/// Reads a json file and parses it as a lua value
|
|
|
|
fn lua_load_json<'a>(lua: &'a Lua, path: String) -> Result<mlua::Value<'a>> {
|
|
|
|
fn lua_load_json(lua: &Lua, path: String) -> Result<mlua::Value<'_>> {
|
|
|
|
let contents = fs::read_to_string(path)?;
|
|
|
|
let contents = fs::read_to_string(path)?;
|
|
|
|
lua_from_json(lua, contents)
|
|
|
|
lua_from_json(lua, contents)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Parse a toml string into a lua value
|
|
|
|
/// Parse a toml string into a lua value
|
|
|
|
fn lua_from_toml<'a>(lua: &'a Lua, toml_string: String) -> Result<mlua::Value<'a>> {
|
|
|
|
fn lua_from_toml(lua: &Lua, toml_string: String) -> Result<mlua::Value<'_>> {
|
|
|
|
let toml_value: toml::Value = toml::from_str(&toml_string).map_err(mlua::Error::external)?;
|
|
|
|
let toml_value: toml::Value = toml::from_str(&toml_string).map_err(mlua::Error::external)?;
|
|
|
|
|
|
|
|
|
|
|
|
lua.to_value(&toml_value)
|
|
|
|
lua.to_value(&toml_value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Reads a toml file and parses it as a lua value
|
|
|
|
/// Reads a toml file and parses it as a lua value
|
|
|
|
fn lua_load_toml<'a>(lua: &'a Lua, path: String) -> Result<mlua::Value<'a>> {
|
|
|
|
fn lua_load_toml(lua: &Lua, path: String) -> Result<mlua::Value<'_>> {
|
|
|
|
let contents = fs::read_to_string(path)?;
|
|
|
|
let contents = fs::read_to_string(path)?;
|
|
|
|
lua_from_toml(lua, contents)
|
|
|
|
lua_from_toml(lua, contents)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// Returns the path to the given command
|
|
|
|
|
|
|
|
fn lua_which(_: &Lua, path: String) -> Result<Option<String>> {
|
|
|
|
|
|
|
|
Ok(which(path).ok().map(|p| p.to_string_lossy().into_owned()))
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Creates a new executable that can be called with a variable number of args
|
|
|
|
/// Creates a new executable that can be called with a variable number of args
|
|
|
|
fn lua_ext<'a>(lua: &'a Lua, program: String) -> Result<Function<'a>> {
|
|
|
|
fn lua_ext(lua: &Lua, program: String) -> Result<Function<'_>> {
|
|
|
|
lua.create_function(move |_lua, args| {
|
|
|
|
lua.create_function(move |_lua, args| {
|
|
|
|
let exit_status = Command::new(&program)
|
|
|
|
let exit_status = Command::new(&program)
|
|
|
|
.args::<Vec<String>, _>(args)
|
|
|
|
.args::<Vec<String>, _>(args)
|
|
|
@ -103,7 +110,7 @@ struct CommandOutput {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Creates a new executable that can be called with a variable number of args
|
|
|
|
/// Creates a new executable that can be called with a variable number of args
|
|
|
|
fn lua_ext_piped<'a>(lua: &'a Lua, program: String) -> Result<Function<'a>> {
|
|
|
|
fn lua_ext_piped(lua: &Lua, program: String) -> Result<Function<'_>> {
|
|
|
|
lua.create_function(move |lua, args| {
|
|
|
|
lua.create_function(move |lua, args| {
|
|
|
|
let cmd = Command::new(&program)
|
|
|
|
let cmd = Command::new(&program)
|
|
|
|
.args::<Vec<String>, _>(args)
|
|
|
|
.args::<Vec<String>, _>(args)
|
|
|
@ -113,8 +120,14 @@ fn lua_ext_piped<'a>(lua: &'a Lua, program: String) -> Result<Function<'a>> {
|
|
|
|
let output = cmd.wait_with_output()?;
|
|
|
|
let output = cmd.wait_with_output()?;
|
|
|
|
let output = CommandOutput {
|
|
|
|
let output = CommandOutput {
|
|
|
|
code: output.status.code().unwrap_or(0),
|
|
|
|
code: output.status.code().unwrap_or(0),
|
|
|
|
stdout: String::from_utf8(output.stdout).map_err(mlua::Error::external)?,
|
|
|
|
stdout: String::from_utf8(output.stdout)
|
|
|
|
stderr: String::from_utf8(output.stderr).map_err(mlua::Error::external)?,
|
|
|
|
.map_err(mlua::Error::external)?
|
|
|
|
|
|
|
|
.trim()
|
|
|
|
|
|
|
|
.into(),
|
|
|
|
|
|
|
|
stderr: String::from_utf8(output.stderr)
|
|
|
|
|
|
|
|
.map_err(mlua::Error::external)?
|
|
|
|
|
|
|
|
.trim()
|
|
|
|
|
|
|
|
.into(),
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
lua.to_value(&output)
|
|
|
|
lua.to_value(&output)
|
|
|
|