DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_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 ResourcesPath = Parent.join("../Resources/extensions");
89
90 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", ResourcesPath.display());
91
92 ScanPathsGuard.push(ResourcesPath);
93
94 let ResourcesAppPath = Parent.join("../Resources/app/extensions");
98
99 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", ResourcesAppPath.display());
100
101 ScanPathsGuard.push(ResourcesAppPath);
102
103 let LocalPath = Parent.join("extensions");
105
106 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", LocalPath.display());
107
108 ScanPathsGuard.push(LocalPath);
109
110 let SkyTargetPath = Parent.join("../../../Sky/Target/Static/Application/extensions");
122
123 if SkyTargetPath.exists() {
124 dev_log!(
125 "extensions",
126 "[Extensions] [ScanPaths] + {} (Sky Target, repo-layout)",
127 SkyTargetPath.display()
128 );
129
130 ScanPathsGuard.push(SkyTargetPath);
131 }
132
133 let DependencyPath = Parent.join("../../../../Dependency/Microsoft/Dependency/Editor/extensions");
136
137 if DependencyPath.exists() {
138 dev_log!(
139 "extensions",
140 "[Extensions] [ScanPaths] + {} (VS Code Dependency, repo-layout)",
141 DependencyPath.display()
142 );
143
144 ScanPathsGuard.push(DependencyPath);
145 }
146 }
147 }
148 } if let Ok(UserOverride) = std::env::var("Lodge") {
161 let OverridePath = ExpandUserPath(&UserOverride);
162
163 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Lodge)", OverridePath.display());
164
165 ScanPathsGuard.push(OverridePath);
166 } else {
167 let UserExtensionPath = crate::IPC::WindServiceHandlers::Utilities::FiddeeRoot::FiddeeRoot().join("extensions");
168
169 dev_log!(
170 "extensions",
171 "[Extensions] [ScanPaths] + {} (User)",
172 UserExtensionPath.display()
173 );
174
175 ScanPathsGuard.push(UserExtensionPath);
176 }
177
178 if let Ok(Extras) = std::env::var("Extend") {
182 let Separator = if cfg!(target_os = "windows") { ';' } else { ':' };
183
184 for Candidate in Extras.split(Separator) {
185 let Trimmed = Candidate.trim();
186
187 if Trimmed.is_empty() {
188 continue;
189 }
190
191 let ExtraPath = ExpandUserPath(Trimmed);
192
193 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Extend)", ExtraPath.display());
194
195 ScanPathsGuard.push(ExtraPath);
196 }
197 }
198
199 if let Ok(DevExtensions) = std::env::var("Probe") {
204 let DevPath = ExpandUserPath(&DevExtensions);
205
206 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Probe)", DevPath.display());
207
208 ScanPathsGuard.push(DevPath);
209 }
210
211 let ScanPaths = ScanPathsGuard.clone();
212
213 dev_log!("extensions", "[Extensions] [ScanPaths] Configured: {:?}", ScanPaths);
214
215 Ok(ScanPaths)
216}
217
218fn ExpandUserPath(Raw:&str) -> PathBuf {
223 if let Some(Stripped) = Raw.strip_prefix("~/") {
224 if let Some(Home) = dirs::home_dir() {
225 return Home.join(Stripped);
226 }
227 }
228
229 PathBuf::from(Raw)
230}