60 lines
1.8 KiB
Swift
60 lines
1.8 KiB
Swift
//
|
|
// Copyright 2023 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
//
|
|
|
|
import Foundation
|
|
|
|
public enum PreKey {
|
|
static let logger = PrefixedLogger(prefix: "[PreKey]")
|
|
}
|
|
|
|
extension PreKey {
|
|
|
|
// Needs to remain in sync with 'Target' below
|
|
public enum SingleTarget: Int, Equatable, CaseIterable {
|
|
case signedPreKey = 1
|
|
case oneTimePreKey = 2
|
|
case oneTimePqPreKey = 4
|
|
case lastResortPqPreKey = 8
|
|
// next raw value: 16 (1 << 4)
|
|
|
|
public var asTarget: Target {
|
|
return Target(rawValue: rawValue)
|
|
}
|
|
}
|
|
|
|
public struct Target: OptionSet, CustomDebugStringConvertible {
|
|
public let rawValue: Int
|
|
public init(rawValue: Int) {
|
|
self.rawValue = rawValue
|
|
}
|
|
|
|
static let signedPreKey = Target(rawValue: SingleTarget.signedPreKey.rawValue)
|
|
static let oneTimePreKey = Target(rawValue: SingleTarget.oneTimePreKey.rawValue)
|
|
static let oneTimePqPreKey = Target(rawValue: SingleTarget.oneTimePqPreKey.rawValue)
|
|
static let lastResortPqPreKey = Target(rawValue: SingleTarget.lastResortPqPreKey.rawValue)
|
|
|
|
public mutating func insert(target: SingleTarget) {
|
|
self.insert(target.asTarget)
|
|
}
|
|
|
|
public func contains(target: SingleTarget) -> Bool {
|
|
self.contains(target.asTarget)
|
|
}
|
|
|
|
public var targets: [SingleTarget] {
|
|
return SingleTarget.allCases.compactMap {
|
|
return self.contains(target: $0) ? $0 : nil
|
|
}
|
|
}
|
|
|
|
static var all: Target {
|
|
SingleTarget.allCases.reduce(into: []) { $0.insert(target: $1) }
|
|
}
|
|
|
|
public var debugDescription: String {
|
|
return "[" + targets.map { "\($0)" }.joined(separator: ", ") + "]"
|
|
}
|
|
}
|
|
}
|