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}