use std::fs::File;
use crate::common::*;
use mlua::prelude::*;
use urs::io::ReadExtra;
mod modules;
pub trait Module {
fn load(&self, state: &mut State) -> Result<(), LuaError>;
}
impl State {
pub fn setup_lua(&mut self) -> Result<(), LuaError> {
if let Some(dir) = get_config_dir(ConfigDir::KnifeDir) {
let s = if let Some(s) = dir.to_str() {
s
} else {
log::log!(log::Error, "Could not add knife directory to load path");
return Err(LuaError::RuntimeError("".to_string()));
};
let code = format!("package.path = package.path..';{}/?/init.lua'", s);
self.lua.load(code).exec()?
}
self.load_module(modules::OS)?;
self.load_module(modules::FS)?;
self.load_module(modules::I3)?;
self.load_module(modules::Util)?;
self.load_module(modules::Desktop)?;
self.load_module(modules::Multimedia)?;
self.load_module(modules::Extra)?;
self.lua.load(include_str!("../lua/globals.lua")).exec()?;
if let Some(dir) = get_config_dir(ConfigDir::RootDir) {
if let Ok(mut f) = File::open(dir.join("init.lua")) {
self.lua.load(f.read_everything()?).exec()?;
}
}
Ok(())
}
pub fn load_module(&mut self, m: impl Module) -> Result<(), LuaError> {
m.load(self)?;
Ok(())
}
pub fn run_knife(&mut self, name: &str) -> Result<(), LuaError> {
for knife in &self.knifes {
if knife.name == name {
let mut f = File::open(&knife.init)?;
self.lua.load(f.read_everything()?).exec()?;
return Ok(());
}
}
log::log!(log::Error, "No knife found: {name}");
Ok(())
}
}