Browse Source

feat: commit plugin interface

mrxiaozhuox 2 years ago
parent
commit
da53c67841
8 changed files with 222 additions and 140 deletions
  1. 70 66
      Cargo.lock
  2. 1 1
      Cargo.toml
  3. 1 1
      src/builder.rs
  4. 0 54
      src/plugin/interface.rs
  5. 51 0
      src/plugin/interface/command.rs
  6. 0 0
      src/plugin/interface/logger.rs
  7. 84 0
      src/plugin/interface/mod.rs
  8. 15 18
      src/plugin/mod.rs

+ 70 - 66
Cargo.lock

@@ -86,9 +86,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
 
 [[package]]
 name = "axum"
-version = "0.5.11"
+version = "0.5.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2cc6e8e8c993cb61a005fab8c1e5093a29199b7253b05a6883999312935c1ff"
+checksum = "c943a505c17b494638a38a9af129067f760c9c06794b9f57d499266909be8e72"
 dependencies = [
  "async-trait",
  "axum-core",
@@ -121,9 +121,9 @@ dependencies = [
 
 [[package]]
 name = "axum-core"
-version = "0.2.6"
+version = "0.2.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf4d047478b986f14a13edad31a009e2e05cb241f9805d0d75e4cba4e129ad4d"
+checksum = "e4f44a0e6200e9d11a1cdc989e4b358f6e3d354fbf48478f345a17f4e43f8635"
 dependencies = [
  "async-trait",
  "bytes",
@@ -263,9 +263,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
 
 [[package]]
 name = "bytes"
-version = "1.1.0"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
+checksum = "f0b3de4a0c5e67e16066a0715723abd91edc2f9001d09c46e1dca929351e130e"
 
 [[package]]
 name = "bzip2"
@@ -369,9 +369,9 @@ dependencies = [
 
 [[package]]
 name = "clap"
-version = "3.2.8"
+version = "3.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "190814073e85d238f31ff738fcb0bf6910cedeb73376c87cd69291028966fd83"
+checksum = "44bbe24bbd31a185bc2c4f7c2abe80bea13a20d57ee4e55be70ac512bdc76417"
 dependencies = [
  "atty",
  "bitflags",
@@ -386,9 +386,9 @@ dependencies = [
 
 [[package]]
 name = "clap_derive"
-version = "3.2.7"
+version = "3.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "759bf187376e1afa7b85b959e6a664a3e7a95203415dba952ad19139e798f902"
+checksum = "9ba52acd3b0a5c33aeada5cdaa3267cdc7c594a98731d4268cdc1532f4264cb4"
 dependencies = [
  "heck 0.4.0",
  "proc-macro-error",
@@ -491,9 +491,9 @@ dependencies = [
 
 [[package]]
 name = "crossbeam-channel"
-version = "0.5.5"
+version = "0.5.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c02a4d71819009c192cf4872265391563fd6a84c81ff2c0f2a7026ca4c1d85c"
+checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
 dependencies = [
  "cfg-if",
  "crossbeam-utils",
@@ -501,9 +501,9 @@ dependencies = [
 
 [[package]]
 name = "crossbeam-utils"
-version = "0.8.10"
+version = "0.8.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d82ee10ce34d7bc12c2122495e7593a9c41347ecdd64185af4ecf72cb1a7f83"
+checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc"
 dependencies = [
  "cfg-if",
  "once_cell",
@@ -511,9 +511,9 @@ dependencies = [
 
 [[package]]
 name = "crypto-common"
-version = "0.1.5"
+version = "0.1.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ccfd8c0ee4cce11e45b3fd6f9d5e69e0cc62912aa6a0cb1bf4617b0eba5a12f"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
 dependencies = [
  "generic-array 0.14.5",
  "typenum",
@@ -521,9 +521,9 @@ dependencies = [
 
 [[package]]
 name = "curl"
-version = "0.4.43"
+version = "0.4.44"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37d855aeef205b43f65a5001e0997d81f8efca7badad4fad7d897aa7f0d0651f"
+checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22"
 dependencies = [
  "curl-sys",
  "libc",
@@ -536,9 +536,9 @@ dependencies = [
 
 [[package]]
 name = "curl-sys"
-version = "0.4.55+curl-7.83.1"
+version = "0.4.56+curl-7.83.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23734ec77368ec583c2e61dd3f0b0e5c98b93abe6d2a004ca06b91dd7e3e2762"
+checksum = "6093e169dd4de29e468fa649fbae11cdcd5551c81fe5bf1b0677adad7ef3d26f"
 dependencies = [
  "cc",
  "libc",
@@ -612,7 +612,7 @@ dependencies = [
 [[package]]
 name = "dioxus"
 version = "0.2.4"
-source = "git+https://github.com/dioxuslabs/dioxus/#2369b0cc7f54cf9a99db2114f9fc6481f14ffd30"
+source = "git+https://github.com/dioxuslabs/dioxus/#15e9aa1958d45438a537a4bb01da0b79c5a3d54d"
 dependencies = [
  "dioxus-core",
  "dioxus-core-macro",
@@ -670,7 +670,7 @@ dependencies = [
 [[package]]
 name = "dioxus-core"
 version = "0.2.1"
-source = "git+https://github.com/dioxuslabs/dioxus/#2369b0cc7f54cf9a99db2114f9fc6481f14ffd30"
+source = "git+https://github.com/dioxuslabs/dioxus/#15e9aa1958d45438a537a4bb01da0b79c5a3d54d"
 dependencies = [
  "backtrace",
  "bumpalo",
@@ -689,7 +689,7 @@ dependencies = [
 [[package]]
 name = "dioxus-core-macro"
 version = "0.2.1"
-source = "git+https://github.com/dioxuslabs/dioxus/#2369b0cc7f54cf9a99db2114f9fc6481f14ffd30"
+source = "git+https://github.com/dioxuslabs/dioxus/#15e9aa1958d45438a537a4bb01da0b79c5a3d54d"
 dependencies = [
  "dioxus-rsx",
  "dioxus-rsx-interpreter",
@@ -701,7 +701,7 @@ dependencies = [
 [[package]]
 name = "dioxus-hooks"
 version = "0.2.1"
-source = "git+https://github.com/dioxuslabs/dioxus/#2369b0cc7f54cf9a99db2114f9fc6481f14ffd30"
+source = "git+https://github.com/dioxuslabs/dioxus/#15e9aa1958d45438a537a4bb01da0b79c5a3d54d"
 dependencies = [
  "dioxus-core",
  "futures-channel",
@@ -711,7 +711,7 @@ dependencies = [
 [[package]]
 name = "dioxus-html"
 version = "0.2.1"
-source = "git+https://github.com/dioxuslabs/dioxus/#2369b0cc7f54cf9a99db2114f9fc6481f14ffd30"
+source = "git+https://github.com/dioxuslabs/dioxus/#15e9aa1958d45438a537a4bb01da0b79c5a3d54d"
 dependencies = [
  "dioxus-core",
  "enumset",
@@ -722,7 +722,7 @@ dependencies = [
 [[package]]
 name = "dioxus-rsx"
 version = "0.0.0"
-source = "git+https://github.com/dioxuslabs/dioxus/#2369b0cc7f54cf9a99db2114f9fc6481f14ffd30"
+source = "git+https://github.com/dioxuslabs/dioxus/#15e9aa1958d45438a537a4bb01da0b79c5a3d54d"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -732,7 +732,7 @@ dependencies = [
 [[package]]
 name = "dioxus-rsx-interpreter"
 version = "0.1.0"
-source = "git+https://github.com/dioxuslabs/dioxus/#2369b0cc7f54cf9a99db2114f9fc6481f14ffd30"
+source = "git+https://github.com/dioxuslabs/dioxus/#15e9aa1958d45438a537a4bb01da0b79c5a3d54d"
 dependencies = [
  "dioxus-core",
  "dioxus-hooks",
@@ -750,7 +750,7 @@ dependencies = [
 [[package]]
 name = "dioxus-ssr"
 version = "0.2.1"
-source = "git+https://github.com/dioxuslabs/dioxus/#2369b0cc7f54cf9a99db2114f9fc6481f14ffd30"
+source = "git+https://github.com/dioxuslabs/dioxus/#15e9aa1958d45438a537a4bb01da0b79c5a3d54d"
 dependencies = [
  "dioxus-core",
 ]
@@ -873,9 +873,9 @@ checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
 
 [[package]]
 name = "fastrand"
-version = "1.7.0"
+version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf"
+checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
 dependencies = [
  "instant",
 ]
@@ -898,7 +898,7 @@ checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall 0.2.13",
+ "redox_syscall 0.2.16",
  "windows-sys",
 ]
 
@@ -1099,9 +1099,9 @@ dependencies = [
 
 [[package]]
 name = "gimli"
-version = "0.26.1"
+version = "0.26.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4"
+checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d"
 
 [[package]]
 name = "h2"
@@ -1124,9 +1124,9 @@ dependencies = [
 
 [[package]]
 name = "hashbrown"
-version = "0.12.2"
+version = "0.12.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "607c8a29735385251a339424dd462993c0fed8fa09d378f259377df08c126022"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
 
 [[package]]
 name = "headers"
@@ -1424,9 +1424,9 @@ dependencies = [
 
 [[package]]
 name = "js-sys"
-version = "0.3.58"
+version = "0.3.59"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27"
+checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2"
 dependencies = [
  "wasm-bindgen",
 ]
@@ -1619,9 +1619,9 @@ dependencies = [
 
 [[package]]
 name = "mlua"
-version = "0.8.1"
+version = "0.8.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a82d0b12c7c8d3bdda5933d2aa322c76e4833d822796495f299990ca652bd1bf"
+checksum = "8afb4815a6d6a3bd1c23e6c647f7df18c9800c12e80526a98e18d7decd7cedcd"
 dependencies = [
  "bstr",
  "cc",
@@ -1788,9 +1788,9 @@ dependencies = [
 
 [[package]]
 name = "os_str_bytes"
-version = "6.1.0"
+version = "6.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21326818e99cfe6ce1e524c2a805c189a99b5ae555a35d19f9a284b427d86afa"
+checksum = "648001efe5d5c0102d8cea768e348da85d90af8ba91f0bea908f157951493cd4"
 
 [[package]]
 name = "parking_lot"
@@ -1810,7 +1810,7 @@ checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall 0.2.13",
+ "redox_syscall 0.2.16",
  "smallvec",
  "windows-sys",
 ]
@@ -1957,9 +1957,9 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.40"
+version = "1.0.42"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7"
+checksum = "c278e965f1d8cf32d6e0e96de3d3e79712178ae67986d9cf9151f51e95aac89b"
 dependencies = [
  "unicode-ident",
 ]
@@ -2017,9 +2017,9 @@ checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
 
 [[package]]
 name = "redox_syscall"
-version = "0.2.13"
+version = "0.2.16"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
 dependencies = [
  "bitflags",
 ]
@@ -2042,7 +2042,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
 dependencies = [
  "getrandom 0.2.7",
- "redox_syscall 0.2.13",
+ "redox_syscall 0.2.16",
  "thiserror",
 ]
 
@@ -2267,18 +2267,18 @@ dependencies = [
 
 [[package]]
 name = "serde"
-version = "1.0.138"
+version = "1.0.140"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1578c6245786b9d168c5447eeacfb96856573ca56c9d68fdcf394be134882a47"
+checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.138"
+version = "1.0.140"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "023e9b1467aef8a10fb88f25611870ada9800ef7e22afce356bb0d2387b6f27c"
+checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2370,9 +2370,12 @@ checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac"
 
 [[package]]
 name = "slab"
-version = "0.4.6"
+version = "0.4.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32"
+checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
+dependencies = [
+ "autocfg",
+]
 
 [[package]]
 name = "smallvec"
@@ -2457,7 +2460,7 @@ dependencies = [
  "cfg-if",
  "fastrand",
  "libc",
- "redox_syscall 0.2.13",
+ "redox_syscall 0.2.16",
  "remove_dir_all",
  "winapi",
 ]
@@ -2553,10 +2556,11 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
 
 [[package]]
 name = "tokio"
-version = "1.19.2"
+version = "1.20.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439"
+checksum = "7a8325f63a7d4774dd041e363b2409ed1c5cbbd0f867795e661df066b2b0a581"
 dependencies = [
+ "autocfg",
  "bytes",
  "libc",
  "memchr",
@@ -2605,9 +2609,9 @@ dependencies = [
 
 [[package]]
 name = "tokio-tungstenite"
-version = "0.17.1"
+version = "0.17.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "06cda1232a49558c46f8a504d5b93101d42c0bf7f911f12a105ba48168f821ae"
+checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181"
 dependencies = [
  "futures-util",
  "log",
@@ -2784,9 +2788,9 @@ checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
 
 [[package]]
 name = "tungstenite"
-version = "0.17.2"
+version = "0.17.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d96a2dea40e7570482f28eb57afbe42d97551905da6a9400acc5c328d24004f5"
+checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0"
 dependencies = [
  "base64 0.13.0",
  "byteorder",
@@ -2830,9 +2834,9 @@ checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.1"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c"
+checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7"
 
 [[package]]
 name = "unicode-normalization"
@@ -3023,9 +3027,9 @@ dependencies = [
 
 [[package]]
 name = "wasm-bindgen-futures"
-version = "0.4.31"
+version = "0.4.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f"
+checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad"
 dependencies = [
  "cfg-if",
  "js-sys",
@@ -3128,9 +3132,9 @@ dependencies = [
 
 [[package]]
 name = "web-sys"
-version = "0.3.58"
+version = "0.3.59"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90"
+checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1"
 dependencies = [
  "js-sys",
  "wasm-bindgen",

+ 1 - 1
Cargo.toml

@@ -13,7 +13,7 @@ license = "MIT/Apache-2.0"
 # cli core
 clap = { version = "3.0.14", features = ["derive"] }
 thiserror = "1.0.30"
-wasm-bindgen-cli-support = "0.2.82"
+wasm-bindgen-cli-support = "0.2.79"
 colored = "2.0.0"
 
 # features

+ 1 - 1
src/builder.rs

@@ -124,7 +124,7 @@ pub fn build(config: &CrateConfig, quiet: bool) -> Result<BuildResult> {
             .unwrap();
     });
     if bindgen_result.is_err() {
-        return Err(Error::BuildFailed("Bindgen build failed! \nThis is probably due to the Bindgen version, dioxus-cli using `0.2.82` Bindgen crate.".to_string()));
+        return Err(Error::BuildFailed("Bindgen build failed! \nThis is probably due to the Bindgen version, dioxus-cli using `0.2.81` Bindgen crate.".to_string()));
     }
 
     // check binaryen:wasm-opt tool

+ 0 - 54
src/plugin/interface.rs

@@ -1,54 +0,0 @@
-use mlua::{FromLua, Function};
-
-pub struct PluginInfo<'lua> {
-    pub name: String,
-    repository: String,
-    author: String,
-
-    on_init: Option<Function<'lua>>,
-    on_load: Option<Function<'lua>>,
-    on_build_start: Option<Function<'lua>>,
-    on_build_end: Option<Function<'lua>>,
-}
-
-impl<'lua> FromLua<'lua> for PluginInfo<'lua> {
-    fn from_lua(lua_value: mlua::Value<'lua>, lua: &'lua mlua::Lua) -> mlua::Result<Self> {
-        let mut res = Self {
-            name: String::default(),
-            repository: String::default(),
-            author: String::default(),
-
-            on_init: None,
-            on_load: None,
-            on_build_start: None,
-            on_build_end: None,
-        };
-        if let mlua::Value::Table(tab) = lua_value {
-            if let Ok(v) = tab.get::<_, String>("name") {
-                res.name = v;
-            }
-            if let Ok(v) = tab.get::<_, String>("repository") {
-                res.repository = v;
-            }
-            if let Ok(v) = tab.get::<_, String>("author") {
-                res.author = v;
-            }
-
-            if let Ok(v) = tab.get::<_, Function>("onInit") {
-                res.on_init = Some(v);
-            }
-            if let Ok(v) = tab.get::<_, Function>("onLoad") {
-                res.on_load = Some(v);
-            }
-            if let Ok(v) = tab.get::<_, Function>("onBuildStart") {
-                res.on_build_start = Some(v);
-            }
-            if let Ok(v) = tab.get::<_, Function>("onBuildEnd") {
-                res.on_build_end = Some(v);
-            }
-
-        }
-
-        Ok(res)
-    }
-}

+ 51 - 0
src/plugin/interface/command.rs

@@ -0,0 +1,51 @@
+use std::process::{Command, Stdio};
+
+use mlua::UserData;
+
+pub struct PluginCommander;
+impl UserData for PluginCommander {
+    fn add_methods<'lua, M: mlua::UserDataMethods<'lua, Self>>(methods: &mut M) {
+        methods.add_function("exec", |_, cmd: Vec<String>| {
+            if cmd.len() == 0 {
+                return Ok(());
+            }
+            let cmd_name = cmd.get(0).unwrap();
+            let mut command = Command::new(cmd_name);
+            let t = cmd
+                .iter()
+                .enumerate()
+                .filter(|(i, _)| *i > 0)
+                .map(|v| v.1.clone())
+                .collect::<Vec<String>>();
+            command.args(t);
+            command.stdout(Stdio::inherit());
+            command.output()?;
+            Ok(())
+        });
+        methods.add_function("execQuiet", |_, cmd: Vec<String>| {
+            if cmd.len() == 0 {
+                return Ok(());
+            }
+            let cmd_name = cmd.get(0).unwrap();
+            let mut command = Command::new(cmd_name);
+            let t = cmd
+                .iter()
+                .enumerate()
+                .filter(|(i, _)| *i > 0)
+                .map(|v| v.1.clone())
+                .collect::<Vec<String>>();
+            command.args(t);
+            command.stdout(Stdio::null());
+            command.output()?;
+            Ok(())
+        });
+        methods.add_function("execSimple", |_, cmd: String| {
+            let _ = Command::new(cmd).stdout(Stdio::inherit()).output()?;
+            Ok(())
+        });
+    }
+
+    fn add_fields<'lua, F: mlua::UserDataFields<'lua, Self>>(_fields: &mut F) {
+        
+    }
+}

+ 0 - 0
src/plugin/logger.rs → src/plugin/interface/logger.rs


+ 84 - 0
src/plugin/interface/mod.rs

@@ -0,0 +1,84 @@
+use mlua::{FromLua, Function, ToLua};
+
+pub mod logger;
+pub mod command;
+
+#[derive(Debug)]
+pub struct PluginInfo<'lua> {
+    pub name: String,
+    pub repository: String,
+    pub author: String,
+
+    pub on_init: Option<Function<'lua>>,
+    pub on_load: Option<Function<'lua>>,
+    pub on_build_start: Option<Function<'lua>>,
+    pub on_build_finish: Option<Function<'lua>>,
+}
+
+impl<'lua> FromLua<'lua> for PluginInfo<'lua> {
+    fn from_lua(lua_value: mlua::Value<'lua>, _lua: &'lua mlua::Lua) -> mlua::Result<Self> {
+        let mut res = Self {
+            name: String::default(),
+            repository: String::default(),
+            author: String::default(),
+
+            on_init: None,
+            on_load: None,
+            on_build_start: None,
+            on_build_finish: None,
+        };
+        if let mlua::Value::Table(tab) = lua_value {
+            if let Ok(v) = tab.get::<_, String>("name") {
+                res.name = v;
+            }
+            if let Ok(v) = tab.get::<_, String>("repository") {
+                res.repository = v;
+            }
+            if let Ok(v) = tab.get::<_, String>("author") {
+                res.author = v;
+            }
+
+            if let Ok(v) = tab.get::<_, Function>("onInit") {
+                res.on_init = Some(v);
+            }
+            if let Ok(v) = tab.get::<_, Function>("onLoad") {
+                res.on_load = Some(v);
+            }
+            if let Ok(v) = tab.get::<_, Function>("onBuildStart") {
+                res.on_build_start = Some(v);
+            }
+            if let Ok(v) = tab.get::<_, Function>("onBuildFinish") {
+                res.on_build_finish = Some(v);
+            }
+
+        }
+
+        Ok(res)
+    }
+}
+
+impl<'lua> ToLua<'lua> for PluginInfo<'lua> {
+    fn to_lua(self, lua: &'lua mlua::Lua) -> mlua::Result<mlua::Value<'lua>> {
+        
+        let res = lua.create_table()?;
+ 
+        res.set("name", self.name.to_string())?;
+        res.set("repository", self.repository.to_string())?;
+        res.set("author", self.author.to_string())?;
+
+        if let Some(e) = self.on_init {
+            res.set("onInit", e)?;
+        }
+        if let Some(e) = self.on_load {
+            res.set("onLoad", e)?;
+        }
+        if let Some(e) = self.on_build_start {
+            res.set("onBuildStart", e)?;
+        }
+        if let Some(e) = self.on_build_finish {
+            res.set("onBuildFinish", e)?;
+        }
+
+        Ok(mlua::Value::Table(res))
+    }
+}

+ 15 - 18
src/plugin/mod.rs

@@ -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();
         }