import Tagged /// Provider-issued notification destinations for one application installation. public enum Push { public enum ApplicationIDTag {} /// Identifies the application whose provider credentials can deliver to the destination. public typealias ApplicationID = Tagged public struct APNS: Equatable, Hashable, Sendable { public enum Environment: String, CaseIterable, Codable, Equatable, Hashable, Sendable { case development case production } public struct DeviceToken: Equatable, Hashable, RawRepresentable, Sendable { public let rawValue: String public init(rawValue: String) { self.rawValue = rawValue } } public var applicationID: ApplicationID public var environment: Environment public var deviceToken: DeviceToken public init( applicationID: ApplicationID, environment: Environment, deviceToken: DeviceToken ) { self.applicationID = applicationID self.environment = environment self.deviceToken = deviceToken } } public struct FCM: Equatable, Hashable, Sendable { public struct InstallationID: Equatable, Hashable, RawRepresentable, Sendable { public let rawValue: String public init(rawValue: String) { self.rawValue = rawValue } } /// Compatibility name for callers created before FCM moved direct sends to Firebase /// Installation IDs. public typealias RegistrationToken = InstallationID public var applicationID: ApplicationID public var installationID: InstallationID public init(applicationID: ApplicationID, installationID: InstallationID) { self.applicationID = applicationID self.installationID = installationID } /// Compatibility initializer for persisted destinations and downstream clients using the /// former registration-token terminology. public init(applicationID: ApplicationID, registrationToken: RegistrationToken) { self.init(applicationID: applicationID, installationID: registrationToken) } public var registrationToken: RegistrationToken { get { installationID } set { installationID = newValue } } } public enum Destination: Equatable, Hashable, Sendable { case apns(APNS) case fcm(FCM) public var applicationID: ApplicationID { switch self { case .apns(let registration): registration.applicationID case .fcm(let registration): registration.applicationID } } } } extension Push.APNS.DeviceToken: CustomDebugStringConvertible { public var debugDescription: String { "" } } extension Push.APNS.DeviceToken: CustomReflectable { public var customMirror: Mirror { Mirror(self, children: ["rawValue": ""], displayStyle: .struct) } } extension Push.APNS.DeviceToken: CustomStringConvertible { public var description: String { "" } } extension Push.FCM.InstallationID: CustomDebugStringConvertible { public var debugDescription: String { "" } } extension Push.FCM.InstallationID: CustomReflectable { public var customMirror: Mirror { Mirror(self, children: ["rawValue": ""], displayStyle: .struct) } } extension Push.FCM.InstallationID: CustomStringConvertible { public var description: String { "" } }