kiwix-apple/Model/Migration/MigrationService.swift
Balazs Perlaki-Horvath 94e552a8c6 Centralise migrations
2024-09-08 18:40:05 +00:00

54 lines
1.7 KiB
Swift

// This file is part of Kiwix for iOS & macOS.
//
// Kiwix is free software; you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// any later version.
//
// Kiwix is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Kiwix; If not, see https://www.gnu.org/licenses/.
import Foundation
protocol UserDefaulting {
func bool(forKey defaultName: String) -> Bool
func setValue(_ value: Any?, forKey key: String)
}
extension UserDefaults: UserDefaulting {}
struct Migration {
let userDefaultsKey: String
let migration: () -> Bool
func migrate(_ userDefaults: UserDefaulting) -> Bool {
guard userDefaults.bool(forKey: userDefaultsKey) != true else {
// migration was done earlier
return true
}
let result: Bool = migration()
userDefaults.setValue(result, forKey: userDefaultsKey)
return result
}
}
struct MigrationService {
let migrations: [Migration]
init(migrations: [Migration] = Migrations.all) {
self.migrations = migrations
}
func migrateAll(using userDefaults: UserDefaulting = UserDefaults.standard) -> Bool {
var allSucceeded = true
for migration in migrations where migration.migrate(userDefaults) == false {
allSucceeded = false
}
return allSucceeded
}
}