use std::path::{Component, Path};
use mlua::prelude::*;
use super::super::lua_exec::{CONFIG_FILE_NAME, execute_config_script};
use super::utils::bad_argument;
use crate::model::AbsolutePath;
pub(super) fn create_include(lua: &Lua, script_path: &AbsolutePath) -> LuaResult<LuaFunction> {
let script_dir = script_path
.parent()
.expect("script should be in some directory")
.to_owned();
lua.create_function(move |lua, relative_path: String| {
if !is_include_path(&relative_path) {
return Err(bad_argument(
"include",
0,
Some("path"),
"must be a relative path without indirection",
));
}
let mut child_script_path = script_dir.clone();
child_script_path.push(relative_path);
child_script_path.push(CONFIG_FILE_NAME);
execute_config_script(lua, child_script_path.into())
})
}
fn is_include_path(relative_path: &str) -> bool {
!relative_path.is_empty()
&& Path::new(relative_path)
.components()
.all(|component| matches!(component, Component::Normal(_)))
}