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 if OverridePath.exists() {
67 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Ship)", OverridePath.display());
68 ScanPathsGuard.push(OverridePath);
69 } else {
70 dev_log!(
71 "extensions",
72 "warn: [Extensions] [ScanPaths] Ship={} does not exist; ignoring",
73 Override
74 );
75 }
76 }
77 }
78
79 if !SkipBuiltins {
81 if let Ok(ExecutableDirectory) = std::env::current_exe() {
82 if let Some(Parent) = ExecutableDirectory.parent() {
83 let ResourcesPath = Parent.join("../Resources/extensions");
87 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", ResourcesPath.display());
88 ScanPathsGuard.push(ResourcesPath);
89
90 let ResourcesAppPath = Parent.join("../Resources/app/extensions");
94 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", ResourcesAppPath.display());
95 ScanPathsGuard.push(ResourcesAppPath);
96
97 let LocalPath = Parent.join("extensions");
99 dev_log!("extensions", "[Extensions] [ScanPaths] + {}", LocalPath.display());
100 ScanPathsGuard.push(LocalPath);
101
102 let SkyTargetPath = Parent.join("../../../Sky/Target/Static/Application/extensions");
114 if SkyTargetPath.exists() {
115 dev_log!(
116 "extensions",
117 "[Extensions] [ScanPaths] + {} (Sky Target, repo-layout)",
118 SkyTargetPath.display()
119 );
120 ScanPathsGuard.push(SkyTargetPath);
121 }
122
123 let DependencyPath = Parent.join("../../../../Dependency/Microsoft/Dependency/Editor/extensions");
126 if DependencyPath.exists() {
127 dev_log!(
128 "extensions",
129 "[Extensions] [ScanPaths] + {} (VS Code Dependency, repo-layout)",
130 DependencyPath.display()
131 );
132 ScanPathsGuard.push(DependencyPath);
133 }
134 }
135 }
136 } if let Ok(UserOverride) = std::env::var("Lodge") {
147 let OverridePath = ExpandUserPath(&UserOverride);
148 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Lodge)", OverridePath.display());
149 ScanPathsGuard.push(OverridePath);
150 } else if let Some(HomeDirectory) = dirs::home_dir() {
151 let UserExtensionPath = HomeDirectory.join(".land/extensions");
152 dev_log!(
153 "extensions",
154 "[Extensions] [ScanPaths] + {} (User)",
155 UserExtensionPath.display()
156 );
157 ScanPathsGuard.push(UserExtensionPath);
158 }
159
160 if let Ok(Extras) = std::env::var("Extend") {
164 let Separator = if cfg!(target_os = "windows") { ';' } else { ':' };
165 for Candidate in Extras.split(Separator) {
166 let Trimmed = Candidate.trim();
167 if Trimmed.is_empty() {
168 continue;
169 }
170 let ExtraPath = ExpandUserPath(Trimmed);
171 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Extend)", ExtraPath.display());
172 ScanPathsGuard.push(ExtraPath);
173 }
174 }
175
176 if let Ok(DevExtensions) = std::env::var("Probe") {
181 let DevPath = ExpandUserPath(&DevExtensions);
182 dev_log!("extensions", "[Extensions] [ScanPaths] + {} (Probe)", DevPath.display());
183 ScanPathsGuard.push(DevPath);
184 }
185
186 let ScanPaths = ScanPathsGuard.clone();
187
188 dev_log!("extensions", "[Extensions] [ScanPaths] Configured: {:?}", ScanPaths);
189
190 Ok(ScanPaths)
191}
192
193fn ExpandUserPath(Raw:&str) -> PathBuf {
198 if let Some(Stripped) = Raw.strip_prefix("~/") {
199 if let Some(Home) = dirs::home_dir() {
200 return Home.join(Stripped);
201 }
202 }
203 PathBuf::from(Raw)
204}