detect/detect.gui/Drivers/NewtonsoftJsonSuspensionDriver.cs
2024-11-13 17:09:15 +08:00

41 lines
1.3 KiB
C#

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<Unit> InvalidateState()
{
if (File.Exists(_stateFilePath))
File.Delete(_stateFilePath);
return Observable.Return(Unit.Default);
}
public IObservable<object> LoadState()
{
var lines = File.Exists(_stateFilePath) ? File.ReadAllText(_stateFilePath) : "{\"$type\":\"detect.gui.ViewModels.MainViewModel, detect.gui\"}";
var state = JsonConvert.DeserializeObject<object>(lines, _settings);
return Observable.Return(state!);
}
public IObservable<Unit> SaveState(object state)
{
var lines = JsonConvert.SerializeObject(state, Formatting.Indented, _settings);
File.WriteAllText(_stateFilePath, lines);
return Observable.Return(Unit.Default);
}
}