#[tauri::command]
pub fn open_file_dialog(
app: tauri::AppHandle,
filters: Option<Vec<FilterItem>>,
) -> Result<Option<String>, String> {
use tauri_plugin_dialog::DialogExt;
let mut builder = app.dialog().file();
if let Some(filter_list) = filters {
for filter in filter_list {
let ext_refs: Vec<&str> = filter.extensions.iter().map(|s| s.as_str()).collect();
builder = builder.add_filter(filter.name, &ext_refs);
}
}
let result = builder.blocking_pick_file();
Ok(result.map(|fp| {
fp.as_path()
.map(|p| p.to_string_lossy().to_string())
.unwrap_or_default()
}))
}
#[tauri::command]
pub fn open_files_dialog(
app: tauri::AppHandle,
) -> Result<Option<Vec<String>>, String> {
use tauri_plugin_dialog::DialogExt;
let result = app.dialog().file().blocking_pick_files();
Ok(result.map(|paths| {
paths.iter().map(|fp| {
fp.as_path()
.map(|p| p.to_string_lossy().to_string())
.unwrap_or_default()
}).filter(|s| !s.is_empty()).collect()
}))
}
#[tauri::command]
pub fn open_folder_dialog(app: tauri::AppHandle) -> Result<Option<String>, String> {
use tauri_plugin_dialog::DialogExt;
let result = app.dialog().file().blocking_pick_folder();
Ok(result.map(|fp| {
fp.as_path()
.map(|p| p.to_string_lossy().to_string())
.unwrap_or_default()
}))
}
#[tauri::command]
pub fn get_cli_args(cli_args: tauri::State<'_, crate::CliArgs>) -> Option<serde_json::Value> {
cli_args.0.lock().ok().and_then(|mut opt| opt.take())
}
#[tauri::command]
pub fn check_file_exists(path: String) -> bool {
std::path::Path::new(&path).exists()
}
#[derive(serde::Deserialize)]
pub struct FilterItem {
pub name: String,
pub extensions: Vec<String>,
}