Skip to content

Commit 7fcc0bc

Browse files
feat(cli/add): add plugin init code to main.rs (#8490)
* feat(cli/add): add plugin to `main.rs` closes #7696 * clippy * fix change file * adjust regex * run cargo fmt * check if already exists * typo [skip ci] --------- Co-authored-by: Lucas Nogueira <lucas@tauri.studio>
1 parent 30be0e3 commit 7fcc0bc

File tree

2 files changed

+68
-36
lines changed

2 files changed

+68
-36
lines changed

.changes/cli-add-to-main-rs.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'tauri-cli': 'patch:feat'
3+
'@tauri-apps/cli': 'patch:feat'
4+
---
5+
6+
Add plugin initialization rust code when using `tauri add`

tooling/cli/src/add.rs

+62-36
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use anyhow::Context;
66
use clap::Parser;
7+
use colored::Colorize;
8+
use regex::Regex;
79

810
use crate::{
911
helpers::{
@@ -41,8 +43,10 @@ pub fn command(options: Options) -> Result<()> {
4143
let mut plugins = plugins();
4244
let metadata = plugins.remove(plugin.as_str()).unwrap_or_default();
4345

46+
let tauri_dir = tauri_dir();
47+
4448
let mut cargo = Command::new("cargo");
45-
cargo.current_dir(tauri_dir()).arg("add").arg(&crate_name);
49+
cargo.current_dir(&tauri_dir).arg("add").arg(&crate_name);
4650

4751
if options.tag.is_some() || options.rev.is_some() || options.branch.is_some() {
4852
cargo
@@ -106,45 +110,67 @@ pub fn command(options: Options) -> Result<()> {
106110
}
107111
}
108112

109-
let rust_code = if metadata.builder {
110-
if metadata.desktop_only {
111-
format!(
112-
r#"tauri::Builder::default()
113-
.setup(|app| {{
114-
#[cfg(desktop)]
115-
app.handle().plugin(tauri_plugin_{plugin_snake_case}::Builder::new().build());
116-
Ok(())
117-
}})
118-
"#,
119-
)
120-
} else {
121-
format!(
122-
r#"tauri::Builder::default()
123-
.setup(|app| {{
124-
app.handle().plugin(tauri_plugin_{plugin_snake_case}::Builder::new().build());
125-
Ok(())
126-
}})
127-
"#,
128-
)
113+
// add plugin init code to main.rs or lib.rs
114+
let plugin_init_fn = if metadata.builder {
115+
"Builder::new().build()"
116+
} else {
117+
"init()"
118+
};
119+
let plugin_init = format!(".plugin(tauri_plugin_{plugin_snake_case}::{plugin_init_fn})");
120+
let re = Regex::new(r"(tauri\s*::\s*Builder\s*::\s*default\(\))(\s*)")?;
121+
for file in [tauri_dir.join("src/main.rs"), tauri_dir.join("src/lib.rs")] {
122+
let contents = std::fs::read_to_string(&file)?;
123+
124+
if contents.contains(&plugin_init) {
125+
log::info!(
126+
"Plugin initialization code already found on {}",
127+
file.display()
128+
);
129+
return Ok(());
130+
}
131+
132+
if re.is_match(&contents) {
133+
let out = re.replace(&contents, format!("$1$2{plugin_init}$2"));
134+
135+
log::info!("Adding plugin to {}", file.display());
136+
std::fs::write(file, out.as_bytes())?;
137+
138+
// run cargo fmt
139+
log::info!("Running `cargo fmt`...");
140+
let _ = Command::new("cargo")
141+
.arg("fmt")
142+
.current_dir(&tauri_dir)
143+
.status();
144+
145+
return Ok(());
129146
}
130-
} else if metadata.desktop_only {
131-
format!(
132-
r#"tauri::Builder::default()
133-
.setup(|app| {{
134-
#[cfg(desktop)]
135-
app.handle().plugin(tauri_plugin_{plugin_snake_case}::init());
136-
Ok(())
137-
}})
138-
"#,
139-
)
147+
}
148+
149+
let builder_code = if metadata.builder {
150+
format!(r#"+ .plugin(tauri_plugin_{plugin_snake_case}::Builder::new().build())"#,)
140151
} else {
141-
format!(
142-
r#"tauri::Builder::default().plugin(tauri_plugin_{plugin_snake_case}::init())
143-
"#,
144-
)
152+
format!(r#"+ .plugin(tauri_plugin_{plugin_snake_case}::init())"#)
145153
};
146154

147-
println!("You must enable the plugin in your Rust code:\n\n{rust_code}");
155+
let rust_code = format!(
156+
r#" {}
157+
{}
158+
{}"#,
159+
"tauri::Builder::default()".dimmed(),
160+
builder_code.normal().green(),
161+
r#".invoke_handler(tauri::generate_handler![])
162+
.run(tauri::generate_context!())
163+
.expect("error while running tauri application");"#
164+
.dimmed(),
165+
);
166+
167+
log::warn!(
168+
"Couldn't find `{}` in `{}` or `{}`, you must enable the plugin in your Rust code manually:\n\n{}",
169+
"tauri::Builder".cyan(),
170+
"main.rs".cyan(),
171+
"lib.rs".cyan(),
172+
rust_code
173+
);
148174

149175
Ok(())
150176
}

0 commit comments

Comments
 (0)