autosway 0.5.0

Automation program
Documentation
use std::{path::PathBuf, sync::Arc};

use super::*;

pub struct Util;
impl Module for Util {
    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_function(|lua, name: String| {
                let knifes = crate::common::get_knifes();
                let f = knifes.par_iter().filter(|knife| knife.name == name);

                match f.collect::<Vec<&Knife>>().first() {
                    Some(k) => Ok(k.path.clone().into_lua(lua)?),
                    None => Ok(LuaValue::Nil),
                }
            })?,
        )?;

        create_module(&state.lua, "autosway.util", module)?;

        Ok(())
    }
}