From 6f4028f065da22830767e926a86df0fb66afa1d3 Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Sun, 14 Aug 2022 18:30:34 -0700 Subject: [PATCH] feat: make new plugin api --- src/plugin/interface/dirs.rs | 18 +---------- src/plugin/interface/{logger.rs => log.rs} | 0 src/plugin/interface/mod.rs | 6 ++-- .../interface/{download.rs => network.rs} | 4 +-- src/plugin/interface/os.rs | 20 ++++++++++++ src/plugin/interface/path.rs | 14 ++++++++ src/plugin/mod.rs | 32 ++++++++++++------- 7 files changed, 62 insertions(+), 32 deletions(-) rename src/plugin/interface/{logger.rs => log.rs} (100%) rename src/plugin/interface/{download.rs => network.rs} (92%) create mode 100644 src/plugin/interface/os.rs create mode 100644 src/plugin/interface/path.rs diff --git a/src/plugin/interface/dirs.rs b/src/plugin/interface/dirs.rs index 914ed60bb..7837482dc 100644 --- a/src/plugin/interface/dirs.rs +++ b/src/plugin/interface/dirs.rs @@ -5,25 +5,9 @@ use crate::tools::app_path; pub struct PluginDirs; impl UserData for PluginDirs { fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { - methods.add_function("plugin_dir", |_, ()| { + methods.add_function("plugins_dir", |_, ()| { let path = app_path().join("plugins"); Ok(path.to_str().unwrap().to_string()) }); - methods.add_function("self_dir", |_, name: String| { - let path = app_path().join("plugins").join(name); - Ok(path.to_str().unwrap().to_string()) - }); - methods.add_function("document_dir", |_, ()| { - let path = dirs::document_dir().unwrap().to_str().unwrap().to_string(); - Ok(path) - }); - methods.add_function("download_dir", |_, ()| { - let path = dirs::download_dir().unwrap().to_str().unwrap().to_string(); - Ok(path) - }); - methods.add_function("cache_dir", |_, ()| { - let path = dirs::cache_dir().unwrap().to_str().unwrap().to_string(); - Ok(path) - }); } } \ No newline at end of file diff --git a/src/plugin/interface/logger.rs b/src/plugin/interface/log.rs similarity index 100% rename from src/plugin/interface/logger.rs rename to src/plugin/interface/log.rs diff --git a/src/plugin/interface/mod.rs b/src/plugin/interface/mod.rs index b5f0b2f30..6ac9730e1 100644 --- a/src/plugin/interface/mod.rs +++ b/src/plugin/interface/mod.rs @@ -1,10 +1,12 @@ use mlua::{FromLua, Function, ToLua}; -pub mod logger; +pub mod log; pub mod command; pub mod fs; -pub mod download; +pub mod network; pub mod dirs; +pub mod path; +pub mod os; #[derive(Debug, Clone)] pub struct PluginInfo<'lua> { diff --git a/src/plugin/interface/download.rs b/src/plugin/interface/network.rs similarity index 92% rename from src/plugin/interface/download.rs rename to src/plugin/interface/network.rs index 2edc68c9d..af6b6ae12 100644 --- a/src/plugin/interface/download.rs +++ b/src/plugin/interface/network.rs @@ -2,8 +2,8 @@ use std::{io::Cursor, path::PathBuf}; use mlua::UserData; -pub struct PluginDownloader; -impl UserData for PluginDownloader { +pub struct PluginNetwork; +impl UserData for PluginNetwork { fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { methods.add_async_function("download_file", |_, args: (String, String)| async move { let url = args.0; diff --git a/src/plugin/interface/os.rs b/src/plugin/interface/os.rs new file mode 100644 index 000000000..f533a0ae9 --- /dev/null +++ b/src/plugin/interface/os.rs @@ -0,0 +1,20 @@ +use std::path::PathBuf; + +use mlua::UserData; + +pub struct PluginOS; +impl UserData for PluginOS { + fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { + methods.add_function("current_platform", |_, ()| { + if cfg!(target_os = "windows") { + Ok("windows") + } else if cfg!(target_os = "macos") { + Ok("macos") + } else if cfg!(target_os = "linux") { + Ok("linux") + } else { + panic!("unsupported platformm"); + } + }); + } +} \ No newline at end of file diff --git a/src/plugin/interface/path.rs b/src/plugin/interface/path.rs new file mode 100644 index 000000000..66584cc52 --- /dev/null +++ b/src/plugin/interface/path.rs @@ -0,0 +1,14 @@ +use std::path::PathBuf; + +use mlua::UserData; + +pub struct PluginPath; +impl UserData for PluginPath { + fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) { + methods.add_function("join", |_, args: (String, String)| { + let current_path = PathBuf::from(args.0); + let new_path = current_path.join(args.1); + Ok(new_path.to_str().unwrap().to_string()) + }); + } +} \ No newline at end of file diff --git a/src/plugin/mod.rs b/src/plugin/mod.rs index 7bda5b105..7bca24c97 100644 --- a/src/plugin/mod.rs +++ b/src/plugin/mod.rs @@ -12,8 +12,8 @@ use crate::tools::{app_path, clone_repo}; use self::{ interface::PluginInfo, interface::{ - command::PluginCommander, dirs::PluginDirs, download::PluginDownloader, - fs::PluginFileSystem, logger::PluginLogger, + command::PluginCommander, dirs::PluginDirs, fs::PluginFileSystem, log::PluginLogger, + network::PluginNetwork, }, }; @@ -39,15 +39,25 @@ impl PluginManager { let manager = lua.create_table().unwrap(); - lua.globals().set("PLUGIN_LOGGER", PluginLogger).unwrap(); - lua.globals() - .set("PLUGIN_COMMAND", PluginCommander) - .unwrap(); - lua.globals().set("PLUGIN_FS", PluginFileSystem).unwrap(); - lua.globals() - .set("PLUGIN_DOWNLOAD", PluginDownloader) - .unwrap(); - lua.globals().set("PLUGIN_DIRS", PluginDirs).unwrap(); + let api = lua.create_table().unwrap(); + + api.set("log", PluginLogger).unwrap(); + api.set("command", PluginCommander).unwrap(); + api.set("network", PluginNetwork).unwrap(); + api.set("dirs", PluginDirs).unwrap(); + api.set("fs", PluginFileSystem).unwrap(); + + lua.globals().set("plugin_lib", api).unwrap(); + + // lua.globals().set("PLUGIN_LOGGER", PluginLogger).unwrap(); + // lua.globals() + // .set("PLUGIN_COMMAND", PluginCommander) + // .unwrap(); + // lua.globals().set("PLUGIN_FS", PluginFileSystem).unwrap(); + // lua.globals() + // .set("PLUGIN_DOWNLOAD", PluginDownloader) + // .unwrap(); + // lua.globals().set("PLUGIN_DIRS", PluginDirs).unwrap(); let plugin_dir = Self::init_plugin_dir(); let mut index: u32 = 1;