session-ios/SessionUtilitiesKit/Database/Types/TargetMigrations.swift

65 lines
2.1 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
public struct TargetMigrations: Comparable {
/// This identifier is used to determine the order each set of migrations should run in.
///
/// All migrations within a specific set will run first, followed by all migrations for the same set index in
/// the next `Identifier` before moving on to the next `MigrationSet`. So given the migrations:
///
/// `{a: [1], [2, 3]}, {b: [4, 5], [6]}`
///
/// the migrations will run in the following order:
///
/// `a1, b4, b5, a2, a3, b6`
public enum Identifier: String, CaseIterable, Comparable {
// WARNING: The string version of these cases are used as migration identifiers so
// changing them will result in the migrations running again
case utilitiesKit
case snodeKit
case messagingKit
public static func < (lhs: Self, rhs: Self) -> Bool {
let lhsIndex: Int = (Identifier.allCases.firstIndex(of: lhs) ?? Identifier.allCases.count)
let rhsIndex: Int = (Identifier.allCases.firstIndex(of: rhs) ?? Identifier.allCases.count)
return (lhsIndex < rhsIndex)
}
func key(with migration: Migration.Type) -> String {
return "\(self.rawValue).\(migration.identifier)"
}
}
public typealias MigrationSet = [Migration.Type]
let identifier: Identifier
let migrations: [MigrationSet]
// MARK: - Initialization
public init(
identifier: Identifier,
migrations: [MigrationSet]
) {
self.identifier = identifier
self.migrations = migrations
}
// MARK: - Equatable
public static func == (lhs: TargetMigrations, rhs: TargetMigrations) -> Bool {
return (
lhs.identifier == rhs.identifier &&
lhs.migrations.count == rhs.migrations.count
)
}
// MARK: - Comparable
public static func < (lhs: Self, rhs: Self) -> Bool {
return (lhs.identifier < rhs.identifier)
}
}