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") {
159 let OverridePath = ExpandUserPath(&UserOverride);
160
161 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Lodge)", OverridePath.display());
162
163 ScanPathsGuard.push(OverridePath);
164 } else if let Some(HomeDirectory) = dirs::home_dir() {
165 let UserExtensionPath = HomeDirectory.join(".land/extensions");
166
167 dev_log!(
168 "extensions",
169 "[Extensions] [ScanPaths] + {} (User)",
170 UserExtensionPath.display()
171 );
172
173 ScanPathsGuard.push(UserExtensionPath);
174 }
175
176 if let Ok(Extras) = std::env::var("Extend") {
180 let Separator = if cfg!(target_os = "windows") { ';' } else { ':' };
181
182 for Candidate in Extras.split(Separator) {
183 let Trimmed = Candidate.trim();
184
185 if Trimmed.is_empty() {
186 continue;
187 }
188
189 let ExtraPath = ExpandUserPath(Trimmed);
190
191 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Extend)", ExtraPath.display());
192
193 ScanPathsGuard.push(ExtraPath);
194 }
195 }
196
197 if let Ok(DevExtensions) = std::env::var("Probe") {
202 let DevPath = ExpandUserPath(&DevExtensions);
203
204 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Probe)", DevPath.display());
205
206 ScanPathsGuard.push(DevPath);
207 }
208
209 let ScanPaths = ScanPathsGuard.clone();
210
211 dev_log!("extensions", "[Extensions] [ScanPaths] Configured: {:?}", ScanPaths);
212
213 Ok(ScanPaths)
214}
215
216fn ExpandUserPath(Raw:&str) -> PathBuf {
221 if let Some(Stripped) = Raw.strip_prefix("~/") {
222 if let Some(Home) = dirs::home_dir() {
223 return Home.join(Stripped);
224 }
225 }
226
227 PathBuf::from(Raw)
228}