Skip to content

Commit fc426a8

Browse files
committed
JsonContext improvements and usage within Settings
1 parent 065eda1 commit fc426a8

File tree

1 file changed

+29
-24
lines changed

1 file changed

+29
-24
lines changed

App/Services/SettingsManager.cs

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public SettingsManager(string? settingsFilePath = null)
7676
throw new ArgumentException("settingsFilePath must be an absolute path if provided", nameof(settingsFilePath));
7777
}
7878

79-
string folder = Path.Combine(
79+
var folder = Path.Combine(
8080
settingsFilePath,
8181
_appName);
8282

@@ -86,9 +86,8 @@ public SettingsManager(string? settingsFilePath = null)
8686
if (!File.Exists(_settingsFilePath))
8787
{
8888
// Create the settings file if it doesn't exist
89-
string emptyJson = JsonSerializer.Serialize(new { });
90-
File.WriteAllText(_settingsFilePath, emptyJson);
9189
_settings = new();
90+
File.WriteAllText(_settingsFilePath, JsonSerializer.Serialize(_settings, SettingsJsonContext.Default.Settings));
9291
}
9392
else
9493
{
@@ -109,12 +108,12 @@ private void Save(string name, bool value)
109108
FileShare.None);
110109

111110
// Ensure cache is loaded before saving
112-
var freshCache = JsonSerializer.Deserialize<Settings>(fs) ?? new();
111+
var freshCache = JsonSerializer.Deserialize(fs, SettingsJsonContext.Default.Settings) ?? new();
113112
_settings = freshCache;
114113
_settings.Options[name] = JsonSerializer.SerializeToElement(value);
115114
fs.Position = 0; // Reset stream position to the beginning before writing
116115

117-
JsonSerializer.Serialize(fs, _settings, new JsonSerializerOptions { WriteIndented = true });
116+
JsonSerializer.Serialize(fs, _settings, SettingsJsonContext.Default.Settings);
118117

119118
// This ensures the file is truncated to the new length
120119
// if the new content is shorter than the old content
@@ -152,33 +151,39 @@ private Settings Load()
152151
try
153152
{
154153
using var fs = File.OpenRead(_settingsFilePath);
155-
return JsonSerializer.Deserialize<Settings>(fs) ?? new(null, new Dictionary<string, JsonElement>());
154+
return JsonSerializer.Deserialize(fs, SettingsJsonContext.Default.Settings) ?? new();
156155
}
157156
catch (Exception ex)
158157
{
159158
throw new InvalidOperationException($"Failed to load settings from {_settingsFilePath}. The file may be corrupted or malformed. Exception: {ex.Message}");
160159
}
161160
}
161+
}
162+
163+
public class Settings
164+
{
165+
/// <summary>
166+
/// User settings version. Increment this when the settings schema changes.
167+
/// In future iterations we will be able to handle migrations when the user has
168+
/// an older version.
169+
/// </summary>
170+
public int Version { get; set; }
171+
public Dictionary<string, JsonElement> Options { get; set; }
162172

163-
[JsonSerializable(typeof(Settings))]
164-
private class Settings
173+
private const int VERSION = 1; // Default version for backward compatibility
174+
public Settings()
165175
{
166-
/// <summary>
167-
/// User settings version. Increment this when the settings schema changes.
168-
/// In future iterations we will be able to handle migrations when the user has
169-
/// an older version.
170-
/// </summary>
171-
public int Version { get; set; } = 1;
172-
public Dictionary<string, JsonElement> Options { get; set; }
173-
public Settings()
174-
{
175-
Options = new Dictionary<string, JsonElement>();
176-
}
176+
Version = VERSION;
177+
Options = [];
178+
}
177179

178-
public Settings(int? version, Dictionary<string, JsonElement> options)
179-
{
180-
Version = version ?? Version;
181-
Options = options;
182-
}
180+
public Settings(int? version, Dictionary<string, JsonElement> options)
181+
{
182+
Version = version ?? VERSION;
183+
Options = options;
183184
}
184185
}
186+
187+
[JsonSerializable(typeof(Settings))]
188+
[JsonSourceGenerationOptions(WriteIndented = true)]
189+
public partial class SettingsJsonContext : JsonSerializerContext;

0 commit comments

Comments
 (0)