autosway 0.4.1

Automation program
Documentation
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(())
    }
}