Forge
csharpdeeb25a2
1using CascadeIDE.Models;
2
3namespace CascadeIDE.Services;
4
5/// <summary>
6/// Заводские настройки: <c>Settings/defaults-settings.toml</c> (диск под exe → embedded).
7/// Пользовательский <c>%LocalAppData%\CascadeIDE\settings.toml</c> merge поверх (см. <see cref="DeserializeEffective"/>).
8/// </summary>
9public static class SettingsDefaultsLoader
10{
11 /// <summary>Относительный путь от <see cref="AppContext.BaseDirectory"/> (опциональный override поверх встроенного бандла).</summary>
12 public const string BundledRelativePath = "Settings/defaults-settings.toml";
13
14 /// <summary>
15 /// Текст шипнутого <c>defaults-settings.toml</c>: сначала файл под <see cref="AppContext.BaseDirectory"/>,
16 /// иначе <see cref="BundledAppContent"/> (EmbeddedResource).
17 /// </summary>
18 /// <exception cref="InvalidOperationException">Нет ни файла рядом с процессом, ни встроенного ресурса.</exception>
19 public static string GetEmbeddedDefaultsToml()
20 {
21 if (!BundledAppContent.TryReadDiskThenEmbedded(BundledRelativePath, out var text) || string.IsNullOrWhiteSpace(text))
22 throw new InvalidOperationException(
23 $"Missing bundled {BundledRelativePath} (disk under AppContext.BaseDirectory or embedded resource in CascadeIDE assembly).");
24 return text;
25 }
26
27 /// <summary>Эффективные настройки без пользовательского файла (embedded defaults).</summary>
28 public static CascadeIdeSettings CreateDefault() => DeserializeEffective(null);
29
30 /// <summary>Merge заводских дефолтов с пользовательским TOML (пусто/null — только дефолты).</summary>
31 public static CascadeIdeSettings DeserializeEffective(string? userTomlNormalized)
32 {
33 var defaults = GetEmbeddedDefaultsToml();
34 var merged = string.IsNullOrWhiteSpace(userTomlNormalized)
35 ? defaults
36 : TomlTableMerge.MergeTomlDocuments(defaults, userTomlNormalized);
37 return CascadeTomlSerializer.Deserialize<CascadeIdeSettings>(merged)
38 ?? throw new InvalidOperationException("Merged settings TOML did not deserialize to CascadeIdeSettings.");
39 }
40}
41
View only · write via MCP/CIDE