Skip to main content

zoi_lua/api/
parse.rs

1use mlua::{self, Lua, LuaSerdeExt, Table};
2
3pub fn add_parse_util(lua: &Lua) -> Result<(), mlua::Error> {
4    let parse_table = lua.create_table()?;
5
6    let json_fn = lua.create_function(|lua, json_str: String| {
7        let value: serde_json::Value = serde_json::from_str(&json_str)
8            .map_err(|e| mlua::Error::RuntimeError(e.to_string()))?;
9        lua.to_value(&value)
10    })?;
11    parse_table.set("json", json_fn)?;
12
13    let yaml_fn = lua.create_function(|lua, yaml_str: String| {
14        let value: serde_yaml::Value = serde_yaml::from_str(&yaml_str)
15            .map_err(|e| mlua::Error::RuntimeError(e.to_string()))?;
16        lua.to_value(&value)
17    })?;
18    parse_table.set("yaml", yaml_fn)?;
19
20    let toml_fn = lua.create_function(|lua, toml_str: String| {
21        let value: toml::Value =
22            toml::from_str(&toml_str).map_err(|e| mlua::Error::RuntimeError(e.to_string()))?;
23        lua.to_value(&value)
24    })?;
25    parse_table.set("toml", toml_fn)?;
26
27    let checksum_fn = lua.create_function(|_, (content, file_name): (String, String)| {
28        for line in content.lines() {
29            let parts: Vec<&str> = line.split_whitespace().collect();
30            if parts.len() == 2 && parts[1] == file_name {
31                return Ok(Some(parts[0].to_string()));
32            }
33        }
34        Ok(None)
35    })?;
36    parse_table.set("checksumFile", checksum_fn)?;
37
38    let utils_table: Table = lua.globals().get("UTILS")?;
39    utils_table.set("PARSE", parse_table)?;
40
41    Ok(())
42}