Forge
csharpdeeb25a2
1using CascadeIDE.Models;
2using Tomlyn;
3using Tomlyn.Model;
4
5namespace CascadeIDE.Services;
6
7/// <summary>
8/// Парсер <c>Settings/settings-categories.toml</c> (опциональный overlay поверх <see cref="SettingsPanelRegistry"/>).
9/// </summary>
10public static class SettingsCategoryCatalog
11{
12 public const string BundledRelativePath = "Settings/settings-categories.toml";
13
14 /// <summary>Каталог для UI: атрибуты на панелях + опциональный TOML-overlay.</summary>
15 public static IReadOnlyList<SettingsCategoryDefinition> LoadOrdered() =>
16 SettingsPanelRegistry.LoadOrdered();
17
18 internal static IReadOnlyList<SettingsCategoryDefinition> LoadBuiltinFallbackList() =>
19 [
20 new() { Id = "themes", Group = "Оформление", Title = "Тема IDE", Panel = SettingsPanelIds.Themes, Order = 0 },
21 new() { Id = "ai_chat", Group = "Агент", Title = "AI и чат", Panel = SettingsPanelIds.AiChat, Order = 10 },
22 new() { Id = "editor", Group = "Редактор", Title = "Редактор", Panel = SettingsPanelIds.Editor, Order = 20 },
23 new() { Id = "csharp_lsp", Group = "Редактор", Title = "C# / LSP", Panel = SettingsPanelIds.CSharpLsp, Order = 30 },
24 new() { Id = "markdown", Group = "Контент", Title = "Markdown · диаграммы", Panel = SettingsPanelIds.Markdown, Order = 40 },
25 new() { Id = "markdown_lsp", Group = "Контент", Title = "Markdown LSP", Panel = SettingsPanelIds.MarkdownLsp, Order = 50 },
26 new() { Id = "hci", Group = "Индекс", Title = "Hybrid Codebase Index", Panel = SettingsPanelIds.Hci, Order = 60 },
27 new() { Id = "workspace_navigation_map", Group = "Рабочая область", Title = "Карта намерений (PFD)", Panel = SettingsPanelIds.WorkspaceNavigationMap, Order = 25 },
28 ];
29
30 internal static IReadOnlyList<SettingsCategoryDefinition> ParseTomlCategories(string text)
31 {
32 try
33 {
34 if (TomlSerializer.Deserialize<TomlTable>(text, CascadeTomlSerializer.Options) is not TomlTable root)
35 return [];
36
37 if (!root.TryGetValue("settings_category", out var node))
38 return [];
39
40 var list = new List<SettingsCategoryDefinition>();
41 switch (node)
42 {
43 case TomlTableArray arr:
44 foreach (var row in arr)
45 TryAddRow(row, list);
46 break;
47 case TomlTable single:
48 TryAddRow(single, list);
49 break;
50 }
51
52 return list;
53 }
54 catch
55 {
56 return [];
57 }
58 }
59
60 private static void TryAddRow(TomlTable row, List<SettingsCategoryDefinition> list)
61 {
62 var panel = GetString(row, "panel");
63 if (string.IsNullOrWhiteSpace(panel))
64 return;
65
66 var title = GetString(row, "title");
67 var id = GetString(row, "id");
68 if (string.IsNullOrWhiteSpace(id))
69 id = panel.Trim();
70
71 list.Add(new SettingsCategoryDefinition
72 {
73 Id = id,
74 Group = GetString(row, "group"),
75 Title = title,
76 Panel = panel.Trim(),
77 Order = GetInt(row, "order"),
78 Hidden = GetBool(row, "hidden"),
79 });
80 }
81
82 private static string GetString(TomlTable row, string key) =>
83 row.TryGetValue(key, out var v) ? v?.ToString()?.Trim() ?? "" : "";
84
85 private static int GetInt(TomlTable row, string key)
86 {
87 if (!row.TryGetValue(key, out var v) || v is null)
88 return 0;
89 return v switch
90 {
91 int i => i,
92 long l => (int)l,
93 _ => int.TryParse(v.ToString(), out var n) ? n : 0,
94 };
95 }
96
97 private static bool GetBool(TomlTable row, string key) =>
98 row.TryGetValue(key, out var v)
99 && v is bool b
100 && b;
101}
102
View only · write via MCP/CIDE