feat: commit plugin interface

This commit is contained in:
mrxiaozhuox committed 2022-07-27 23:51:35 +08:00
1 parent a21433016a
commit da53c67841
8 files changed
+222 -140

No files matched your search

+15 -18
View File
@@ -1,16 +1,13 @@
use std::{fs::create_dir_all, io::Read, path::PathBuf};
use std::{io::Read, path::PathBuf};
use mlua::{Lua, Table};
use serde::{Deserialize, Serialize};
use walkdir::WalkDir;
use crate::tools::{app_path, clone_repo};
use self::{interface::PluginInfo, logger::PluginLogger};
use self::{interface::{logger::PluginLogger, command::PluginCommander}, interface::PluginInfo};
pub mod logger;
mod interface;
pub mod interface;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PluginConfig {
@@ -33,10 +30,15 @@ impl PluginManager {
let manager = lua.create_table().unwrap();
lua.globals().set("plugin_logger", PluginLogger).unwrap();
lua.globals().set("plugin_commander", PluginCommander).unwrap();
let plugin_dir = Self::init_plugin_dir();
let mut index = 0;
for entry in WalkDir::new(&plugin_dir).into_iter().filter_map(|e| e.ok()) {
let mut index = 1;
for entry in std::fs::read_dir(&plugin_dir).ok()? {
if entry.is_err() {
continue;
}
let entry = entry.unwrap();
let plugin_dir = entry.path().to_path_buf();
if plugin_dir.is_dir() {
let init_file = plugin_dir.join("init.lua");
@@ -44,16 +46,13 @@ impl PluginManager {
let mut file = std::fs::File::open(init_file).unwrap();
let mut buffer = String::new();
file.read_to_string(&mut buffer).unwrap();
let info = lua.load(&buffer).eval::<mlua::Value>().unwrap();
let info = lua.load(&buffer).eval::<PluginInfo>().unwrap();
let _ = manager.set(index, info);
index += 1;
}
index += 1;
}
}
lua.globals()
.set("package.path", format!("{}", plugin_dir.display())).unwrap();
lua.globals().set("manager", manager).unwrap();
Some(Self { lua })
@@ -62,10 +61,9 @@ impl PluginManager {
pub fn load_all_plugins(&self) -> anyhow::Result<()> {
let lua = &self.lua;
let manager = lua.globals().get::<_, Table>("manager")?;
println!("{:?}", manager.len());
for i in 0..(manager.len()? as i32) {
for i in 1..(manager.len()? as i32 + 1) {
let v = manager.get::<i32, PluginInfo>(i)?;
println!("{:?}", v.name);
println!("{v:?}");
let code = format!("manager[{i}].onLoad()");
lua.load(&code).exec()?;
}
@@ -73,11 +71,10 @@ impl PluginManager {
}
fn init_plugin_dir() -> PathBuf {
log::info!("📖 Start to init plugin library ...");
let app_path = app_path();
let plugin_path = app_path.join("plugins");
if !plugin_path.is_dir() {
log::info!("📖 Start to init plugin library ...");
let url = "https://github.com/DioxusLabs/cli-plugin-library";
clone_repo(&plugin_path, url).unwrap();
}