use std::{path::PathBuf, sync::Arc};
use super::*;
pub struct Util;
impl Module for Util {
async fn load(&self, state: &mut State) -> Result<(), LuaError> {
let module = state.lua.create_table()?;
module.set(
"parse_json",
state.lua.create_function(|lua, json: String| {
match serde_json::from_str::<serde_json::Value>(&json) {
Ok(r) => Ok(lua.to_value(&r)?),
Err(e) => Err(LuaError::external(Arc::new(e))),
}
})?,
)?;
module.set(
"serialize_json",
state.lua.create_function(|_, value: LuaValue| {
match serde_json::to_string(&value) {
Ok(r) => Ok(r),
Err(e) => Err(LuaError::external(Arc::new(e))),
}
})?,
)?;
module.set(
"join_path",
state
.lua
.create_function(|_, (path, right): (PathBuf, PathBuf)| Ok(path.join(right)))?,
)?;
module.set(
"string_split",
state
.lua
.create_function(|lua, (string, delim): (String, String)| {
let v: Vec<_> = string.split(&delim).collect();
Ok(v.into_lua(lua))
})?,
)?;
module.set(
"string_trim",
state
.lua
.create_function(|_, string: String| Ok(string.trim().to_owned()))?,
)?;
module.set(
"string_index",
state
.lua
.create_function(|_, (string, index): (String, usize)| {
Ok(string.into_bytes()[index])
})?,
)?;
module.set(
"get_knife_path",
state
.lua
.create_async_function(|lua, knife: String| async move {
let knifes = crate::common::get_knifes().await;
for k in knifes {
if k.name == knife {
return k.path.into_lua(&lua);
}
}
Ok(LuaValue::Nil)
})?,
)?;
create_module(&state.lua, "autosway.util", module)?;
Ok(())
}
}