use std::env;
use std::fs::{self, File};
use std::io::Write;
use std::path::Path;
use syn::parse_file;
use tauri_helper_core::{find_workspace_dir, get_workspace, get_workspace_members};
use walkdir::WalkDir;
pub use tauri_helper_core::types::TauriHelperOptions;
pub use tauri_helper_macros::*;
#[allow(clippy::needless_doctest_main)]
pub fn generate_command_file(options: TauriHelperOptions) {
let workspace_root = find_workspace_dir(Path::new(&env::var("CARGO_MANIFEST_DIR").unwrap()));
let commands_dir = workspace_root.join("target").join("tauri_commands_list");
fs::create_dir_all(&commands_dir).unwrap();
let workspace_members = get_workspace_members(&workspace_root);
for member in &workspace_members {
println!("cargo:rerun-if-changed={}", member);
}
for member in workspace_members {
let manifest_dir = workspace_root.join(&member);
let crate_name = manifest_dir
.file_name()
.and_then(|n| n.to_str())
.unwrap_or_default();
let mut functions = Vec::new();
let src_dir = manifest_dir.join("src");
for entry in WalkDir::new(src_dir).into_iter().filter_map(|e| e.ok()) {
let path = entry.path();
if path.extension().and_then(|e| e.to_str()) == Some("rs") {
if let Ok(content) = fs::read_to_string(path) {
if let Ok(ast) = parse_file(&content) {
for item in ast.items {
if !options.collect_all {
if let syn::Item::Fn(func) = item {
for attr in &func.attrs {
if attr.path().is_ident("auto_collect_command") {
functions.push(func.sig.ident.to_string());
}
}
}
} else if let syn::Item::Fn(func) = item {
for attr in &func.attrs {
let path = &attr.path();
if path.is_ident("command")
|| (path.segments.len() == 2
&& path.segments[0].ident == "tauri"
&& path.segments[1].ident == "command")
{
functions.push(func.sig.ident.to_string());
}
}
}
}
}
}
}
}
let package_name = get_workspace().package.name.replace("-", "_");
let command_file = commands_dir.join(format!("{}.txt", crate_name));
let mut file = File::create(&command_file).unwrap();
for func in functions {
if crate_name.replace("-", "_") == "src_tauri" {
let full_name = format!("{}::{}", package_name, func);
println!("found: {:#?}", &full_name);
writeln!(file, "{}", full_name).unwrap();
} else {
let full_name = format!("{}::{}", crate_name.replace("-", "_"), func);
println!("found: {:#?}", &full_name);
writeln!(file, "{}", full_name).unwrap();
}
}
}
}