Mountain/Binary/Extension/
ScanPathConfigure.rs1use std::path::PathBuf;
6
7use crate::{
8 ApplicationState::State::ApplicationState::{ApplicationState, MapLockError},
9 dev_log,
10};
11
12pub fn ScanPathConfigure(AppState:&std::sync::Arc<ApplicationState>) -> Result<Vec<PathBuf>, String> {
33 dev_log!("extensions", "[Extensions] [ScanPaths] Locking ExtensionScanPaths...");
34
35 let mut ScanPathsGuard = AppState
36 .Extension
37 .Registry
38 .ExtensionScanPaths
39 .lock()
40 .map_err(MapLockError)
41 .map_err(|e| format!("Failed to lock ExtensionScanPaths: {}", e))?;
42
43 let SkipBuiltins = matches!(std::env::var("Skip").as_deref(), Ok("1") | Ok("true"))
49 || matches!(std::env::var("Skip").as_deref(), Ok("1") | Ok("true"));
50
51 if SkipBuiltins {
52 dev_log!(
53 "extensions",
54 "[Extensions] [ScanPaths] Skip=true - skipping all built-in paths, keeping user path"
55 );
56 } else {
57 dev_log!("extensions", "[Extensions] [ScanPaths] Adding default scan paths...");
58 }
59
60 if !SkipBuiltins {
64 if let Ok(Override) = std::env::var("Ship") {
65 let OverridePath = ExpandUserPath(&Override);
66
67 if OverridePath.exists() {
68 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Ship)", OverridePath.display());
69
70 ScanPathsGuard.push(OverridePath);
71 } else {
72 dev_log!(
73 "extensions",
74 "warn: [Extensions] [ScanPaths] Ship={} does not exist; ignoring",
75 Override
76 );
77 }
78 }
79 }
80
81 if !SkipBuiltins {
83 if let Ok(ExecutableDirectory) = std::env::current_exe() {
84 if let Some(Parent) = ExecutableDirectory.parent() {
85 let Normalize = |P:std::path::PathBuf| -> std::path::PathBuf {
90 if P.exists() {
91 return P.canonicalize().unwrap_or(P);
92 }
93 let mut Out:Vec<std::path::Component> = Vec::new();
94 for C in P.components() {
95 match C {
96 std::path::Component::ParentDir => {
97 Out.pop();
98 },
99 _ => Out.push(C),
100 }
101 }
102 Out.iter().collect()
103 };
104
105 let StaticAppExtPath = Parent.join("../Resources/Static/Application/extensions");
109
110 if StaticAppExtPath.exists() {
111 let StaticAppExtPath = Normalize(StaticAppExtPath);
112 dev_log!(
113 "extensions",
114 "[Extensions] [ScanPaths] + {} (Static/Application canonical)",
115 StaticAppExtPath.display()
116 );
117
118 ScanPathsGuard.push(StaticAppExtPath);
119 }
120
121 let ResourcesPath = Normalize(Parent.join("../Resources/extensions"));
124
125 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", ResourcesPath.display());
126
127 ScanPathsGuard.push(ResourcesPath);
128
129 let ResourcesAppPath = Normalize(Parent.join("../Resources/app/extensions"));
131
132 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", ResourcesAppPath.display());
133
134 ScanPathsGuard.push(ResourcesAppPath);
135
136 let LocalPath = Parent.join("extensions");
138
139 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", LocalPath.display());
140
141 ScanPathsGuard.push(LocalPath);
142
143 let SkyTargetPath = Parent.join("../../../Sky/Target/Static/Application/extensions");
155
156 if SkyTargetPath.exists() {
157 let SkyTargetPath = Normalize(SkyTargetPath);
158 dev_log!(
159 "extensions",
160 "[Extensions] [ScanPaths] + {} (Sky Target, repo-layout)",
161 SkyTargetPath.display()
162 );
163
164 ScanPathsGuard.push(SkyTargetPath);
165 }
166
167 let DependencyPath = Parent.join("../../../../Dependency/Microsoft/Dependency/Editor/extensions");
170
171 if DependencyPath.exists() {
172 dev_log!(
173 "extensions",
174 "[Extensions] [ScanPaths] + {} (VS Code Dependency, repo-layout)",
175 DependencyPath.display()
176 );
177
178 ScanPathsGuard.push(DependencyPath);
179 }
180 }
181 }
182 } if let Ok(UserOverride) = std::env::var("Lodge") {
195 let OverridePath = ExpandUserPath(&UserOverride);
196
197 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Lodge)", OverridePath.display());
198
199 ScanPathsGuard.push(OverridePath);
200 } else {
201 let UserExtensionPath = crate::IPC::WindServiceHandlers::Utilities::FiddeeRoot::Fn().join("extensions");
202
203 dev_log!(
204 "extensions",
205 "[Extensions] [ScanPaths] + {} (User)",
206 UserExtensionPath.display()
207 );
208
209 ScanPathsGuard.push(UserExtensionPath);
210 }
211
212 if let Ok(Extras) = std::env::var("Extend") {
216 let Separator = if cfg!(target_os = "windows") { ';' } else { ':' };
217
218 for Candidate in Extras.split(Separator) {
219 let Trimmed = Candidate.trim();
220
221 if Trimmed.is_empty() {
222 continue;
223 }
224
225 let ExtraPath = ExpandUserPath(Trimmed);
226
227 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Extend)", ExtraPath.display());
228
229 ScanPathsGuard.push(ExtraPath);
230 }
231 }
232
233 if let Ok(DevExtensions) = std::env::var("Probe") {
238 let DevPath = ExpandUserPath(&DevExtensions);
239
240 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Probe)", DevPath.display());
241
242 ScanPathsGuard.push(DevPath);
243 }
244
245 let ScanPaths = ScanPathsGuard.clone();
246
247 dev_log!("extensions", "[Extensions] [ScanPaths] Configured: {:?}", ScanPaths);
248
249 Ok(ScanPaths)
250}
251
252fn ExpandUserPath(Raw:&str) -> PathBuf {
257 if let Some(Stripped) = Raw.strip_prefix("~/") {
258 if let Some(Home) = dirs::home_dir() {
259 return Home.join(Stripped);
260 }
261 }
262
263 PathBuf::from(Raw)
264}