summaryrefslogtreecommitdiff
path: root/Sora/Data/Settings/SettingsCodec.swift
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-18 11:45:06 -0800
committerFuwn <[email protected]>2026-02-18 11:57:36 -0800
commit07c533116dd267e3e6e70d673f97bbb87f600f1f (patch)
treee744ebf8b78bc23e4639cef9b4483942140c4055 /Sora/Data/Settings/SettingsCodec.swift
parenttest: add baseline test harness and performance baseline report (diff)
downloadsora-testing-07c533116dd267e3e6e70d673f97bbb87f600f1f.tar.xz
sora-testing-07c533116dd267e3e6e70d673f97bbb87f600f1f.zip
refactor: remove duplicate settings serialisation work
Diffstat (limited to 'Sora/Data/Settings/SettingsCodec.swift')
-rw-r--r--Sora/Data/Settings/SettingsCodec.swift43
1 files changed, 43 insertions, 0 deletions
diff --git a/Sora/Data/Settings/SettingsCodec.swift b/Sora/Data/Settings/SettingsCodec.swift
new file mode 100644
index 0000000..4ec361a
--- /dev/null
+++ b/Sora/Data/Settings/SettingsCodec.swift
@@ -0,0 +1,43 @@
+import Foundation
+import SwiftUI
+
+@MainActor
+enum SettingsCodec {
+ private static let sharedJSONEncoder = JSONEncoder()
+ private static let sharedJSONDecoder = JSONDecoder()
+
+ static func encode<T: Encodable>(_ value: T) -> Data? {
+ try? sharedJSONEncoder.encode(value)
+ }
+
+ static func decode<T: Decodable>(_ type: T.Type, from data: Data) -> T? {
+ try? sharedJSONDecoder.decode(type, from: data)
+ }
+
+ static func encodeOnce<T: Encodable>(_ value: T) -> (value: T, encodedData: Data)? {
+ guard let encodedData = encode(value) else { return nil }
+
+ return (value: value, encodedData: encodedData)
+ }
+
+ @discardableResult
+ static func applyIfChanged(
+ encodedData: Data,
+ localData: Binding<Data>,
+ key: String,
+ enableSync: Bool
+ ) -> Bool {
+ guard localData.wrappedValue != encodedData else {
+ return false
+ }
+
+ localData.wrappedValue = encodedData
+
+ if enableSync {
+ NSUbiquitousKeyValueStore.default.set(encodedData, forKey: key)
+ NSUbiquitousKeyValueStore.default.synchronize()
+ }
+
+ return true
+ }
+}