From da53c6784141bfe49dbdf82750120114b7e188a8 Mon Sep 17 00:00:00 2001 From: mrxiaozhuox Date: Wed, 27 Jul 2022 23:51:35 +0800 Subject: [PATCH] feat: commit plugin interface --- Cargo.lock | 136 ++++++++++++++------------- Cargo.toml | 2 +- src/builder.rs | 2 +- src/plugin/interface.rs | 54 ----------- src/plugin/interface/command.rs | 51 ++++++++++ src/plugin/{ => interface}/logger.rs | 0 src/plugin/interface/mod.rs | 84 +++++++++++++++++ src/plugin/mod.rs | 33 +++---- 8 files changed, 222 insertions(+), 140 deletions(-) delete mode 100644 src/plugin/interface.rs create mode 100644 src/plugin/interface/command.rs rename src/plugin/{ => interface}/logger.rs (100%) create mode 100644 src/plugin/interface/mod.rs diff --git a/Cargo.lock b/Cargo.lock index eaff1048a..0457bed9a 100644 --- a/Cargo.lock +++ b/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", diff --git a/Cargo.toml b/Cargo.toml index 9f0f18aef..31ac60386 100644 --- a/Cargo.toml +++ b/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 diff --git a/src/builder.rs b/src/builder.rs index 7f87757bd..5cb994a65 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -124,7 +124,7 @@ pub fn build(config: &CrateConfig, quiet: bool) -> Result { .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 diff --git a/src/plugin/interface.rs b/src/plugin/interface.rs deleted file mode 100644 index 399b6919f..000000000 --- a/src/plugin/interface.rs +++ /dev/null @@ -1,54 +0,0 @@ -use mlua::{FromLua, Function}; - -pub struct PluginInfo<'lua> { - pub name: String, - repository: String, - author: String, - - on_init: Option>, - on_load: Option>, - on_build_start: Option>, - on_build_end: Option>, -} - -impl<'lua> FromLua<'lua> for PluginInfo<'lua> { - fn from_lua(lua_value: mlua::Value<'lua>, lua: &'lua mlua::Lua) -> mlua::Result { - 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) - } -} diff --git a/src/plugin/interface/command.rs b/src/plugin/interface/command.rs new file mode 100644 index 000000000..23d940601 --- /dev/null +++ b/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| { + 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::>(); + command.args(t); + command.stdout(Stdio::inherit()); + command.output()?; + Ok(()) + }); + methods.add_function("execQuiet", |_, cmd: Vec| { + 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::>(); + 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) { + + } +} diff --git a/src/plugin/logger.rs b/src/plugin/interface/logger.rs similarity index 100% rename from src/plugin/logger.rs rename to src/plugin/interface/logger.rs diff --git a/src/plugin/interface/mod.rs b/src/plugin/interface/mod.rs new file mode 100644 index 000000000..219ba2f47 --- /dev/null +++ b/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>, + pub on_load: Option>, + pub on_build_start: Option>, + pub on_build_finish: Option>, +} + +impl<'lua> FromLua<'lua> for PluginInfo<'lua> { + fn from_lua(lua_value: mlua::Value<'lua>, _lua: &'lua mlua::Lua) -> mlua::Result { + 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> { + + 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)) + } +} \ No newline at end of file diff --git a/src/plugin/mod.rs b/src/plugin/mod.rs index 0379b4fe9..0defe1b55 100644 --- a/src/plugin/mod.rs +++ b/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::().unwrap(); + let info = lua.load(&buffer).eval::().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::(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(); }