using System.Text.Json; namespace WiiCompiled.Setup.Linux; /// Reads and atomically writes the small JSON state documents this tool keeps. internal static class JsonState { private static readonly JsonSerializerOptions ReadOptions = new() { PropertyNameCaseInsensitive = true }; private static readonly JsonSerializerOptions WriteOptions = new() { WriteIndented = true }; public static T? TryRead(string path) where T : class { try { return File.Exists(path) ? JsonSerializer.Deserialize(File.ReadAllText(path), ReadOptions) : null; } catch { // A truncated or hand-edited state document must degrade into "unknown", which every // caller already treats as "assume stale and re-run install", not into a crash. return null; } } public static void Write(string path, T value) { var directory = Path.GetDirectoryName(path); if (!string.IsNullOrEmpty(directory)) Directory.CreateDirectory(directory); var tempPath = path + ".tmp-" + Guid.NewGuid().ToString("N"); File.WriteAllText(tempPath, JsonSerializer.Serialize(value, WriteOptions)); File.Move(tempPath, path, overwrite: true); } }