win-rar 0.1.0

A Windows archive manager supporting ZIP, 7z, RAR, TAR with encryption, shell integration, and drag-and-drop
// Copyright (c) 北京锋通科技有限公司 — 郭玉峰、吴琼
// SPDX-License-Identifier: MIT

/// 打开文件选择对话框
#[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>,
}