Skip to main content

Mountain/IPC/WindServiceHandlers/Extension/
VsixPathFromArgs.rs

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