-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathEssentialsAutomationSettingsStore.cs
More file actions
113 lines (98 loc) · 3.53 KB
/
EssentialsAutomationSettingsStore.cs
File metadata and controls
113 lines (98 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Collections.Immutable;
using TidyWindow.Core.Maintenance;
namespace TidyWindow.App.Services;
/// <summary>
/// Persists essentials automation settings to disk.
/// </summary>
public sealed class EssentialsAutomationSettingsStore
{
private readonly string _filePath;
private readonly JsonSerializerOptions _serializerOptions;
private readonly object _syncRoot = new();
public EssentialsAutomationSettingsStore()
{
var root = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "TidyWindow");
Directory.CreateDirectory(root);
_filePath = Path.Combine(root, "essentials-automation.json");
_serializerOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = false,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
};
}
public EssentialsAutomationSettings Get()
{
lock (_syncRoot)
{
try
{
if (!File.Exists(_filePath))
{
return EssentialsAutomationSettings.Default;
}
using var stream = File.OpenRead(_filePath);
var payload = JsonSerializer.Deserialize<StatePayload>(stream, _serializerOptions);
return payload?.ToSettings() ?? EssentialsAutomationSettings.Default;
}
catch
{
return EssentialsAutomationSettings.Default;
}
}
}
public void Save(EssentialsAutomationSettings settings)
{
if (settings is null)
{
throw new ArgumentNullException(nameof(settings));
}
lock (_syncRoot)
{
try
{
var payload = StatePayload.FromSettings(settings);
var tempPath = _filePath + ".tmp";
using (var stream = File.Create(tempPath))
{
JsonSerializer.Serialize(stream, payload, _serializerOptions);
stream.Flush(true);
}
File.Copy(tempPath, _filePath, overwrite: true);
File.Delete(tempPath);
}
catch
{
// Persistence failures should not bubble up into the UI layer.
}
}
}
private sealed class StatePayload
{
public bool AutomationEnabled { get; set; }
public int IntervalMinutes { get; set; }
public DateTimeOffset? LastRunUtc { get; set; }
public List<string> TaskIds { get; set; } = new();
public EssentialsAutomationSettings ToSettings()
{
var tasks = TaskIds?.Where(static id => !string.IsNullOrWhiteSpace(id)).ToImmutableArray() ?? ImmutableArray<string>.Empty;
return new EssentialsAutomationSettings(AutomationEnabled, IntervalMinutes, LastRunUtc, tasks);
}
public static StatePayload FromSettings(EssentialsAutomationSettings settings)
{
return new StatePayload
{
AutomationEnabled = settings.AutomationEnabled,
IntervalMinutes = settings.IntervalMinutes,
LastRunUtc = settings.LastRunUtc,
TaskIds = settings.TaskIds.IsDefault ? new List<string>() : settings.TaskIds.ToList()
};
}
}
}