Mountain/IPC/WindServiceHandlers/NativeHost/
ShowSaveDialog.rs1use serde_json::{Value, json};
5use tauri::AppHandle;
6use tauri_plugin_dialog::DialogExt;
7
8use crate::IPC::WindServiceHandlers::Utilities::JsonValueHelpers::arg_val;
9
10pub async fn Fn(ApplicationHandle:AppHandle, Arguments:Vec<Value>) -> Result<Value, String> {
11 let Options = arg_val(&Arguments, 0);
12
13 let Title = Options.get("title").and_then(Value::as_str).unwrap_or("Save").to_string();
14
15 let DefaultPath = Options.get("defaultPath").and_then(Value::as_str).map(str::to_string);
16
17 let Handle = ApplicationHandle.clone();
18
19 let Joined = tokio::task::spawn_blocking(move || -> Option<String> {
20 let mut Builder = Handle.dialog().file().set_title(&Title);
21
22 if let Some(Path) = DefaultPath.as_deref() {
23 Builder = Builder.set_directory(Path);
24 }
25
26 Builder.blocking_save_file().map(|P| P.to_string())
27 })
28 .await;
29
30 match Joined {
31 Ok(Some(Path)) => Ok(json!({ "canceled": false, "filePath": Path })),
32
33 Ok(None) => Ok(json!({ "canceled": true })),
34
35 Err(Error) => Err(format!("showSaveDialog join error: {}", Error)),
36 }
37}