feat: commit code
This commit is contained in:
1 parent
0e8414b40a
commit
6c1374edb3
6 files changed
+145
-81
No files matched your search
Generated
+11
@@ -808,6 +808,15 @@ dependencies = [
|
|||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "erased-serde"
|
||||||
|
version = "0.3.22"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "003000e712ad0f95857bd4d2ef8d1890069e06554101697d12050668b2f6f020"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "euclid"
|
name = "euclid"
|
||||||
version = "0.22.7"
|
version = "0.22.7"
|
||||||
@@ -1591,6 +1600,7 @@ checksum = "10277581090f5cb7ecf814bc611152ce4db6dc8deffcaa08e24ed4c5197d9186"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"bstr",
|
"bstr",
|
||||||
"cc",
|
"cc",
|
||||||
|
"erased-serde",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
"futures-task",
|
"futures-task",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
@@ -1600,6 +1610,7 @@ dependencies = [
|
|||||||
"once_cell",
|
"once_cell",
|
||||||
"pkg-config",
|
"pkg-config",
|
||||||
"rustc-hash",
|
"rustc-hash",
|
||||||
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
+1
-1
@@ -60,7 +60,7 @@ dioxus-rsx-interpreter = { git = "https://github.com/dioxuslabs/dioxus/" }
|
|||||||
proc-macro2 = { version = "1.0", features = ["span-locations"] }
|
proc-macro2 = { version = "1.0", features = ["span-locations"] }
|
||||||
|
|
||||||
# plugin packages
|
# plugin packages
|
||||||
mlua = { version = "0.8.1", features = ["lua54", "vendored", "async"] }
|
mlua = { version = "0.8.1", features = ["lua54", "vendored", "async", "serialize"] }
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
path = "src/main.rs"
|
path = "src/main.rs"
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ impl Build {
|
|||||||
.clone()
|
.clone()
|
||||||
});
|
});
|
||||||
|
|
||||||
let _ = plugin_manager.on_build_event(&crate_config, &platform);
|
let _ = plugin_manager.on_build_start(&crate_config, &platform);
|
||||||
|
|
||||||
match platform.as_str() {
|
match platform.as_str() {
|
||||||
"web" => {
|
"web" => {
|
||||||
@@ -65,6 +65,8 @@ impl Build {
|
|||||||
)?;
|
)?;
|
||||||
file.write_all(temp.as_bytes())?;
|
file.write_all(temp.as_bytes())?;
|
||||||
|
|
||||||
|
let _ = plugin_manager.on_build_finish(&crate_config, &platform);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
use mlua::{FromLua, Function, ToLua};
|
use mlua::{FromLua, Function, ToLua};
|
||||||
|
use serde::Serialize;
|
||||||
|
|
||||||
pub mod command;
|
pub mod command;
|
||||||
pub mod dirs;
|
pub mod dirs;
|
||||||
@@ -47,6 +48,11 @@ impl<'lua> FromLua<'lua> for PluginInfo<'lua> {
|
|||||||
if let Ok(v) = tab.get::<_, Function>("on_init") {
|
if let Ok(v) = tab.get::<_, Function>("on_init") {
|
||||||
res.on_init = Some(v);
|
res.on_init = Some(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Ok(v) = tab.get::<_, PluginBuildInfo>("build") {
|
||||||
|
res.build = v;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(res)
|
Ok(res)
|
||||||
@@ -114,3 +120,12 @@ impl<'lua> ToLua<'lua> for PluginBuildInfo<'lua> {
|
|||||||
Ok(mlua::Value::Table(res))
|
Ok(mlua::Value::Table(res))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Default, Serialize)]
|
||||||
|
pub struct PluginServeInfo<'lua> {
|
||||||
|
|
||||||
|
pub interval: i32,
|
||||||
|
|
||||||
|
pub on_start: Option<Function<'lua>>,
|
||||||
|
pub on_interval: Option<Function<'lua>>,
|
||||||
|
}
|
||||||
+80
-33
@@ -3,11 +3,14 @@ use std::{
|
|||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
};
|
};
|
||||||
|
|
||||||
use mlua::{AsChunk, Lua, Table};
|
use mlua::{AsChunk, Lua, Table, ToLuaMulti};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
|
||||||
use crate::{tools::{app_path, clone_repo}, CrateConfig};
|
use crate::{
|
||||||
|
tools::{app_path, clone_repo},
|
||||||
|
CrateConfig,
|
||||||
|
};
|
||||||
|
|
||||||
use self::{
|
use self::{
|
||||||
interface::PluginInfo,
|
interface::PluginInfo,
|
||||||
@@ -70,19 +73,28 @@ impl PluginManager {
|
|||||||
let mut file = std::fs::File::open(init_file).unwrap();
|
let mut file = std::fs::File::open(init_file).unwrap();
|
||||||
let mut buffer = String::new();
|
let mut buffer = String::new();
|
||||||
file.read_to_string(&mut buffer).unwrap();
|
file.read_to_string(&mut buffer).unwrap();
|
||||||
let info = lua.load(&buffer).eval::<PluginInfo>().unwrap();
|
|
||||||
let _ = manager.set(index, info.clone());
|
|
||||||
|
|
||||||
let dir_name_str = plugin_dir.name().unwrap().to_string();
|
let info = lua.load(&buffer).eval::<PluginInfo>();
|
||||||
lua.globals().set("current_dir_name", dir_name_str).unwrap();
|
match info {
|
||||||
|
Ok(info) => {
|
||||||
|
let _ = manager.set(index, info.clone());
|
||||||
|
|
||||||
// call `on_init` if file "dcp.json" not exists
|
let dir_name_str = plugin_dir.name().unwrap().to_string();
|
||||||
let dcp_file = plugin_dir.join("dcp.json");
|
lua.globals().set("current_dir_name", dir_name_str).unwrap();
|
||||||
if !dcp_file.is_file() {
|
|
||||||
init_list.push((index, dcp_file, info));
|
// call `on_init` if file "dcp.json" not exists
|
||||||
|
let dcp_file = plugin_dir.join("dcp.json");
|
||||||
|
if !dcp_file.is_file() {
|
||||||
|
init_list.push((index, dcp_file, info));
|
||||||
|
}
|
||||||
|
|
||||||
|
index += 1;
|
||||||
|
}
|
||||||
|
Err(_e) => {
|
||||||
|
let dir_name = plugin_dir.file_name().unwrap().to_str().unwrap();
|
||||||
|
log::error!("Plugin '{dir_name}' load failed.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
index += 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,33 +121,68 @@ impl PluginManager {
|
|||||||
Some(Self { lua })
|
Some(Self { lua })
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn load_all_plugins(&self) -> anyhow::Result<()> {
|
pub fn on_build_start(&self, crate_config: &CrateConfig, platform: &str) -> anyhow::Result<()> {
|
||||||
// let lua = &self.lua;
|
|
||||||
// let manager = lua.globals().get::<_, Table>("manager")?;
|
|
||||||
// for i in 1..(manager.len()? as i32 + 1) {
|
|
||||||
// let _ = manager.get::<i32, PluginInfo>(i)?;
|
|
||||||
// let code = format!("manager[{i}].on_load()");
|
|
||||||
// lua.load(&code).exec()?;
|
|
||||||
// }
|
|
||||||
// Ok(())
|
|
||||||
// }
|
|
||||||
|
|
||||||
pub fn on_build_event(&self, crate_config: &CrateConfig, platform: &str) -> anyhow::Result<()> {
|
|
||||||
let lua = &self.lua;
|
let lua = &self.lua;
|
||||||
|
|
||||||
let manager = lua.globals().get::<_, Table>("manager")?;
|
let manager = lua.globals().get::<_, Table>("manager")?;
|
||||||
|
|
||||||
let info = json!({
|
let args = lua.create_table()?;
|
||||||
"name": crate_config.dioxus_config.application.name,
|
args.set("name", crate_config.dioxus_config.application.name.clone())?;
|
||||||
"platform": platform,
|
args.set("platform", platform)?;
|
||||||
"out_dir": crate_config.out_dir.to_str().unwrap(),
|
args.set("out_dir", crate_config.out_dir.to_str().unwrap())?;
|
||||||
"asset_dir": crate_config.asset_dir.to_str().unwrap(),
|
args.set("asset_dir", crate_config.asset_dir.to_str().unwrap())?;
|
||||||
});
|
|
||||||
|
|
||||||
for i in 1..(manager.len()? as i32 + 1) {
|
for i in 1..(manager.len()? as i32 + 1) {
|
||||||
let _ = manager.get::<i32, PluginInfo>(i)?;
|
let info = manager.get::<i32, PluginInfo>(i)?;
|
||||||
let code = format!("manager[{i}].build.on_start({})", info.to_string());
|
if let Some(func) = info.build.on_start {
|
||||||
lua.load(&code).exec()?;
|
func.call::<Table, ()>(args.clone())?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn on_build_finish(
|
||||||
|
&self,
|
||||||
|
crate_config: &CrateConfig,
|
||||||
|
platform: &str,
|
||||||
|
) -> anyhow::Result<()> {
|
||||||
|
let lua = &self.lua;
|
||||||
|
|
||||||
|
let manager = lua.globals().get::<_, Table>("manager")?;
|
||||||
|
|
||||||
|
let args = lua.create_table()?;
|
||||||
|
args.set("name", crate_config.dioxus_config.application.name.clone())?;
|
||||||
|
args.set("platform", platform)?;
|
||||||
|
args.set("out_dir", crate_config.out_dir.to_str().unwrap())?;
|
||||||
|
args.set("asset_dir", crate_config.asset_dir.to_str().unwrap())?;
|
||||||
|
|
||||||
|
for i in 1..(manager.len()? as i32 + 1) {
|
||||||
|
let info = manager.get::<i32, PluginInfo>(i)?;
|
||||||
|
if let Some(func) = info.build.on_finish {
|
||||||
|
func.call::<Table, ()>(args.clone())?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn call_event<'lua>(&self, event: &str, args: impl ToLuaMulti<'lua>) -> anyhow::Result<()> {
|
||||||
|
let lua = &self.lua;
|
||||||
|
|
||||||
|
let manager = lua.globals().get::<_, Table>("manager")?;
|
||||||
|
|
||||||
|
for i in 1..(manager.len()? as i32 + 1) {
|
||||||
|
let info = manager.get::<_, PluginInfo>(i)?;
|
||||||
|
let func = match event {
|
||||||
|
"on_init" => info.on_init,
|
||||||
|
"build.on_start" => info.build.on_start,
|
||||||
|
_ => None,
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(func) = func {
|
||||||
|
func.call(args)?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
+35
-46
@@ -151,58 +151,47 @@ pub async fn startup_hot_reload(port: u16, config: CrateConfig) -> Result<()> {
|
|||||||
} else {
|
} else {
|
||||||
*last = last.split_at(end.column).0;
|
*last = last.split_at(end.column).0;
|
||||||
}
|
}
|
||||||
if let Some(last) = lines.last_mut() {
|
|
||||||
// if there is only one line the start index of last line will be the start of the rsx!, not the start of the line
|
|
||||||
if start.line == end.line {
|
|
||||||
*last = last
|
|
||||||
.split_at(end.column - start.column)
|
|
||||||
.0;
|
|
||||||
} else {
|
|
||||||
*last = last.split_at(end.column).0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let rsx = lines.join("\n");
|
|
||||||
messages.push(SetRsxMessage {
|
|
||||||
location: hr,
|
|
||||||
new_text: rsx,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
let rsx = lines.join("\n");
|
||||||
|
messages.push(SetRsxMessage {
|
||||||
|
location: hr,
|
||||||
|
new_text: rsx,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// if this is a new file, rebuild the project
|
|
||||||
*last_file_rebuild = FileMap::new(crate_dir.clone());
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// if this is a new file, rebuild the project
|
||||||
|
*last_file_rebuild = FileMap::new(crate_dir.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if needs_rebuild {
|
|
||||||
match build_manager.rebuild() {
|
|
||||||
Ok(res) => {
|
|
||||||
print_console_info(
|
|
||||||
port,
|
|
||||||
&config,
|
|
||||||
PrettierOptions {
|
|
||||||
changed: evt.paths,
|
|
||||||
warnings: res.warnings,
|
|
||||||
elapsed_time: res.elapsed_time,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
log::error!("{}", err);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !messages.is_empty() {
|
|
||||||
let _ = hot_reload_tx.send(SetManyRsxMessage(messages));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
last_update_time = chrono::Local::now().timestamp();
|
if needs_rebuild {
|
||||||
|
match build_manager.rebuild() {
|
||||||
|
Ok(res) => {
|
||||||
|
print_console_info(
|
||||||
|
port,
|
||||||
|
&config,
|
||||||
|
PrettierOptions {
|
||||||
|
changed: evt.paths,
|
||||||
|
warnings: res.warnings,
|
||||||
|
elapsed_time: res.elapsed_time,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
log::error!("{}", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !messages.is_empty() {
|
||||||
|
let _ = hot_reload_tx.send(SetManyRsxMessage(messages));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
last_update_time = chrono::Local::now().timestamp();
|
||||||
notify::Config::default(),
|
}
|
||||||
)
|
})
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
for sub_path in allow_watch_path {
|
for sub_path in allow_watch_path {
|
||||||
@@ -332,11 +321,11 @@ pub async fn startup_default(port: u16, config: CrateConfig) -> Result<()> {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Err(e) => log::error!("{}", e),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
notify::Config::default(),
|
})
|
||||||
)
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
for sub_path in allow_watch_path {
|
for sub_path in allow_watch_path {
|
||||||
|
|||||||
Reference in new issue
Block a user