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}