using System; using System.IO; using System.Reactive; using System.Reactive.Linq; using Newtonsoft.Json; using ReactiveUI; namespace detect.gui.Drivers; public sealed class NewtonsoftJsonSuspensionDriver : ISuspensionDriver { private readonly string _stateFilePath; private readonly JsonSerializerSettings _settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; public NewtonsoftJsonSuspensionDriver(string stateFilePath) => _stateFilePath = stateFilePath; public IObservable InvalidateState() { if (File.Exists(_stateFilePath)) File.Delete(_stateFilePath); return Observable.Return(Unit.Default); } public IObservable LoadState() { var lines = File.Exists(_stateFilePath) ? File.ReadAllText(_stateFilePath) : "{\"$type\":\"detect.gui.ViewModels.MainViewModel, detect.gui\"}"; var state = JsonConvert.DeserializeObject(lines, _settings); return Observable.Return(state!); } public IObservable SaveState(object state) { var lines = JsonConvert.SerializeObject(state, Formatting.Indented, _settings); File.WriteAllText(_stateFilePath, lines); return Observable.Return(Unit.Default); } }