Skip to main content

lib/mprocs/
config_lua.rs

1use anyhow::{bail, Result};
2use mlua::Value;
3
4type V = serde_yaml::Value;
5
6pub fn load_lua_config(_path: &str, src: &str) -> Result<V> {
7  let lua = mlua::Lua::new();
8  let v: Value = lua.load(src).eval().unwrap();
9  conv_value(v)
10}
11
12fn conv_value(value: Value) -> Result<V> {
13  let v = match value {
14    Value::Nil => V::Null,
15    Value::Boolean(x) => V::Bool(x),
16    Value::LightUserData(_) => todo!(),
17    Value::Integer(x) => V::Number(x.into()),
18    Value::Number(x) => V::Number(x.into()),
19    Value::String(x) => V::String(x.to_string_lossy().to_string()),
20    Value::Table(x) => {
21      let mut map = serde_yaml::Mapping::new();
22      for entry in x.pairs::<Value, Value>() {
23        let (k, v) = entry.unwrap();
24        map.insert(conv_value(k)?, conv_value(v)?);
25      }
26      V::Mapping(map)
27    }
28    Value::Function(_x) => todo!(),
29    Value::Thread(_x) => todo!(),
30    Value::UserData(_) => todo!(),
31    Value::Other(_) => todo!(),
32    Value::Error(err) => bail!("{:?}", err),
33  };
34  Ok(v)
35}