Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/IPC/WindServiceHandlers/NativeHost/
ShowSaveDialogUI.rs

1//! Wire method: `UserInterface.ShowSaveDialog`.
2//! Returns bare path string or null so Wind's `typeof Result === "string"`
3//! guard finds a string value directly.
4
5use serde_json::{Value, json};
6use tauri::AppHandle;
7use tauri_plugin_dialog::DialogExt;
8
9pub async fn Fn(ApplicationHandle:AppHandle, Arguments:Vec<Value>) -> Result<Value, String> {
10	let Options = Arguments.first().cloned().unwrap_or(Value::Null);
11
12	let Title = Options.get("title").and_then(Value::as_str).unwrap_or("Save").to_string();
13
14	let DefaultPath = Options.get("defaultPath").and_then(Value::as_str).map(str::to_string);
15
16	let Handle = ApplicationHandle.clone();
17
18	let Joined = tokio::task::spawn_blocking(move || -> Option<String> {
19		let mut Builder = Handle.dialog().file().set_title(&Title);
20		if let Some(Path) = DefaultPath.as_deref() {
21			Builder = Builder.set_directory(Path);
22		}
23		Builder.blocking_save_file().map(|P| P.to_string())
24	})
25	.await;
26
27	match Joined {
28		Ok(Some(Path)) => Ok(json!(Path)),
29
30		Ok(None) => Ok(Value::Null),
31
32		Err(Error) => Err(format!("UserInterface.ShowSaveDialog join error: {}", Error)),
33	}
34}