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}