forked from CodeEditApp/CodeEdit
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCEWorkspaceSettings.swift
More file actions
68 lines (55 loc) · 2.1 KB
/
Copy pathCEWorkspaceSettings.swift
File metadata and controls
68 lines (55 loc) · 2.1 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
//
// CEWorkspaceSettingsManager.swift
// CodeEdit
//
// Created by Axel Martinez on 27/3/24.
//
import SwiftUI
import Combine
/// The CodeEdit workspace settings model.
final class CEWorkspaceSettings: ObservableObject {
@Published public var settings: CEWorkspaceSettingsData = .init()
private var storeTask: AnyCancellable?
private let fileManager = FileManager.default
private(set) var folderURL: URL
private var settingsURL: URL {
folderURL.appendingPathComponent("settings").appendingPathExtension("json")
}
init(workspaceURL: URL) {
folderURL = workspaceURL.appendingPathComponent(".codeedit", isDirectory: true)
loadSettings()
storeTask = $settings
.receive(on: DispatchQueue.main)
.throttle(for: 2.0, scheduler: RunLoop.main, latest: true)
.sink { _ in
try? self.savePreferences()
}
}
func cleanUp() {
storeTask?.cancel()
storeTask = nil
}
deinit {
cleanUp()
}
/// Load and construct ``CEWorkspaceSettings`` model from `.codeedit/settings.json`
private func loadSettings() {
guard fileManager.fileExists(atPath: settingsURL.path),
let json = try? Data(contentsOf: settingsURL),
let prefs = try? JSONDecoder().decode(CEWorkspaceSettingsData.self, from: json)
else { return }
self.settings = prefs
}
/// Save``CEWorkspaceSettingsManager`` model to `.codeedit/settings.json`
func savePreferences() throws {
// If the user doesn't have any settings to save, don't save them.
guard !settings.isEmpty() else { return }
if !fileManager.fileExists(atPath: folderURL.path()) {
try fileManager.createDirectory(at: folderURL, withIntermediateDirectories: true)
}
let data = try JSONEncoder().encode(settings)
let json = try JSONSerialization.jsonObject(with: data)
let prettyJSON = try JSONSerialization.data(withJSONObject: json, options: [.prettyPrinted])
try prettyJSON.write(to: settingsURL, options: .atomic)
}
}