dotune 0.1.0

A cross-platform dotfile manager configured with Lua
use std::fs;
use std::sync::Arc;

use mlua::prelude::*;

use super::lua_api::script_environment;
use crate::cli;
use crate::model::{AbsolutePath, SystemInfo};

pub const CONFIG_FILE_NAME: &str = ".dotune.lua";

pub fn execute_root_script(
    lua: &Lua,
    args: &cli::Args,
    system_info: Arc<SystemInfo>,
) -> LuaResult<()> {
    let root_script_path = args.repo_path.join(CONFIG_FILE_NAME);
    execute_config_script(lua, root_script_path.into(), system_info)
}

pub(super) fn execute_config_script(
    lua: &Lua,
    script_path: Arc<AbsolutePath>,
    system_info: Arc<SystemInfo>,
) -> LuaResult<()> {
    let script_fn = load_script(lua, script_path, system_info)?;
    script_fn.call(())
}

fn load_script(
    lua: &Lua,
    file_path: Arc<AbsolutePath>,
    system_info: Arc<SystemInfo>,
) -> LuaResult<LuaFunction> {
    let source_code = fs::read(file_path.as_ref()).map_err(|error| {
        LuaError::external(format!("could not read '{}': {error}", file_path.display()))
    })?;

    let chunk_name = format!("@{}", file_path.display());
    let environment = script_environment(lua, file_path, system_info)?;

    lua.load(source_code)
        .set_name(chunk_name)
        .set_environment(environment)
        .into_function()
}