diff options
| author | Fuwn <[email protected]> | 2026-02-18 11:45:06 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-18 11:57:36 -0800 |
| commit | 07c533116dd267e3e6e70d673f97bbb87f600f1f (patch) | |
| tree | e744ebf8b78bc23e4639cef9b4483942140c4055 /Sora/Data/Settings/SettingsCodec.swift | |
| parent | test: add baseline test harness and performance baseline report (diff) | |
| download | sora-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.swift | 43 |
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 + } +} |