Skip to main content

Mountain/IPC/WindServiceHandlers/Utilities/UserdataDir/
Ensure.rs

1//! First-access scaffolding: creates userdata directories and default files.
2//! Idempotent - the atomic flag skips the walk after the first pass.
3
4use crate::dev_log;
5
6pub fn Fn() {
7	if super::INITIALIZED.swap(true, std::sync::atomic::Ordering::Relaxed) {
8		return;
9	}
10
11	let Base = super::Get::Fn();
12
13	let Dirs = [
14		format!("{}/User", Base),
15		format!("{}/User/globalStorage", Base),
16		format!("{}/User/profiles/__default__profile__", Base),
17		format!("{}/User/snippets", Base),
18		format!("{}/User/prompts", Base),
19		format!("{}/User/cacheHome", Base),
20		format!("{}/logs", Base),
21		format!("{}/User/workspaceStorage", Base),
22		format!(
23			"{}/CachedConfigurations/defaults/__default__profile__-configurationDefaultsOverrides",
24			Base
25		),
26	];
27
28	for Dir in &Dirs {
29		if let Err(E) = std::fs::create_dir_all(Dir) {
30			dev_log!("lifecycle", "Failed to create userdata dir {}: {}", Dir, E);
31		}
32	}
33
34	let DefaultFiles = [
35		(format!("{}/User/settings.json", Base), "{}"),
36		(format!("{}/User/keybindings.json", Base), "[]"),
37		(format!("{}/User/tasks.json", Base), "{}"),
38		(format!("{}/User/extensions.json", Base), "[]"),
39		(format!("{}/User/mcp.json", Base), "{}"),
40	];
41
42	for (FilePath, DefaultContent) in &DefaultFiles {
43		if !std::path::Path::new(FilePath).exists() {
44			if let Err(E) = std::fs::write(FilePath, DefaultContent) {
45				dev_log!("lifecycle", "Failed to create default file {}: {}", FilePath, E);
46			}
47		}
48	}
49
50	dev_log!("lifecycle", "userdata dirs initialized at: {}/User/", Base);
51}