use crate::run::RuntimeContext;
use crate::support::code::run_prune_to_declarations;
use crate::Result;
use mlua::{Lua, Table, Value};
pub fn init_module(lua: &Lua, _runtime_context: &RuntimeContext) -> Result<Table> {
let table = lua.create_table()?;
let prune_fn = lua.create_function(prune_to_declarations)?;
table.set("prune_to_declarations", prune_fn)?;
Ok(table)
}
fn prune_to_declarations(lua: &Lua, code: String) -> mlua::Result<Value> {
match run_prune_to_declarations(&code) {
Ok(result) => Ok(Value::String(lua.create_string(&result)?)),
Err(err) => Err(crate::Error::Lua(format!("Failed to prune Rust code: {}", err)).into()),
}
}
#[cfg(test)]
mod tests {
type Result<T> = core::result::Result<T, Box<dyn std::error::Error>>;
use crate::_test_support::{setup_lua, eval_lua, assert_contains};
#[tokio::test]
async fn test_lua_rust_prune_to_declarations() -> Result<()> {
let lua = setup_lua(super::init_module, "rust")?;
let data_script = r#"
//! Some top comment
use some::module; // and comment
/// Some comment
pub fn async some_async_fn(some_arg: String) -> i32{
let some = "code";
123
}
// Some fn normal
fn some_normal() {
// DOING SOME STUFF
// some fn stuff
}
"#;
let script = format!("return utils.rust.prune_to_declarations({:?})", data_script);
let res = eval_lua(&lua, &script)?;
let res = res.as_str().ok_or("Should be str")?;
assert_contains(res, "use some::module; // and comment ");
assert_contains(res, "async some_async_fn(some_arg: String) -> i32");
assert_contains(res, "fn some_normal()");
assert!(!res.contains(r#"let some = "code";"#), "should NOT contain let some ...");
assert!(!res.contains("// DOING SOME STUFF"), "DOING SOME STUFF");
Ok(())
}
}