Skip to main content

Mountain/IPC/WindServiceHandlers/Extension/
VsixPathFromArgs.rs

1//! Extract a filesystem path from the first arg of `extensions:install`.
2//! Wind's install dialog hands us either a raw string ("file:///..." or
3//! absolute path) or a Tauri-serialised `UriComponents` object; both forms
4//! collapse to a single `PathBuf` here. `None` when the arg is missing,
5//! malformed, or carries a non-file scheme.
6
7use std::path::PathBuf;
8
9use serde_json::Value;
10
11pub fn Fn(Args:&[Value]) -> Option<PathBuf> {
12	let Raw = Args.first()?;
13
14	let RawString = if let Some(AsStr) = Raw.as_str() {
15		AsStr.to_string()
16	} else if let Some(AsObject) = Raw.as_object() {
17		// Wind can pass a UriComponents object; pull the conventional fields.
18		if let Some(External) = AsObject.get("external").and_then(|V| V.as_str()) {
19			External.to_string()
20		} else if let Some(Path) = AsObject.get("path").and_then(|V| V.as_str()) {
21			Path.to_string()
22		} else {
23			return None;
24		}
25	} else {
26		return None;
27	};
28
29	if let Ok(Parsed) = url::Url::parse(&RawString) {
30		if Parsed.scheme() == "file" {
31			return Some(Parsed.to_file_path().unwrap_or_else(|_| PathBuf::from(Parsed.path())));
32		}
33	}
34
35	Some(PathBuf::from(RawString))
36}