vfox 2025.9.21

Interface to vfox plugins
Documentation
use mlua::{IntoLua, Lua, LuaSerdeExt, Value};

use crate::error::Result;
use crate::hooks::env_keys::EnvKey;
use crate::Plugin;

#[derive(Debug)]
pub struct MiseEnvContext<T: serde::Serialize> {
    pub args: Vec<String>,
    pub options: T,
}

impl Plugin {
    pub async fn mise_env<T: serde::Serialize>(
        &self,
        ctx: MiseEnvContext<T>,
    ) -> Result<Vec<EnvKey>> {
        debug!("[vfox:{}] mise_env", &self.name);
        let env_keys = self
            .eval_async(chunk! {
                require "hooks/mise_env"
                return PLUGIN:MiseEnv($ctx)
            })
            .await?;

        Ok(env_keys)
    }
}

impl<T: serde::Serialize> IntoLua for MiseEnvContext<T> {
    fn into_lua(self, lua: &Lua) -> mlua::Result<Value> {
        let table = lua.create_table()?;
        table.set("options", lua.to_value(&self.options)?)?;
        Ok(Value::Table(table))
    }
}