// AdModels.swift // Defines core ad models for the FusionAds SDK // Corresponds to AdModels.kt in Android implementation import Foundation import UIKit // MARK: - AdPlatform public class AdPlatform: Hashable, CustomStringConvertible, Codable { public let name: String private init(_ name: String) { self.name = name } required public init(from decoder: any Decoder) throws { let container = try decoder.singleValueContainer() self.name = try container.decode(String.self) } public func encode(to encoder: any Encoder) throws { var container = encoder.singleValueContainer() try container.encode(self.name) } public static let adMob = AdPlatform("ADMOB") public static let amazon = AdPlatform("AMZ") public static let facebook = AdPlatform("FB") public static let ironSource = AdPlatform("ULP") public static let max = AdPlatform("MAX") public static let tradPlus = AdPlatform("TP") public static let pangle = AdPlatform("PG") public static let invalid = AdPlatform("INVALID") public static let fusion = AdPlatform("FUSION") public static let test = AdPlatform("TEST") public static func fromName(_ name: String) -> AdPlatform { let upperName = name.uppercased() switch upperName { case AdPlatform.adMob.name: return AdPlatform.adMob case AdPlatform.amazon.name: return AdPlatform.amazon case AdPlatform.facebook.name: return AdPlatform.facebook case AdPlatform.ironSource.name: return AdPlatform.ironSource case AdPlatform.max.name: return AdPlatform.max case AdPlatform.test.name: return AdPlatform.test default: fatalError("Invalid Ad Platform name") } } public static func == (lhs: AdPlatform, rhs: AdPlatform) -> Bool { return lhs.name == rhs.name } public func hash(into hasher: inout Hasher) { hasher.combine(name) } public var description: String { return name } } // MARK: - AdType /** * Ad format or type of an ad unit, * [name] mainly for display scenario * [label] for more formal scenario, like stats */ public class AdType: Equatable, Hashable, CustomStringConvertible { public let name: String public let label: String private init(_ name: String, label: String) { self.name = name self.label = label } public static let Interstitial = AdType("Interstitial", label: "INTER") public static let Rewarded = AdType("Rewarded", label: "REWARDED") public static let Banner = AdType("Banner", label: "BANNER") public static let MRec = AdType("MRec", label: "MREC") public static func fromName(_ name: String) -> AdType { switch name { case AdType.Interstitial.name: return AdType.Interstitial case AdType.Rewarded.name: return AdType.Rewarded case AdType.Banner.name: return AdType.Banner case AdType.MRec.name: return AdType.MRec default: fatalError("Invalid Ad Type name") } } public static func == (lhs: AdType, rhs: AdType) -> Bool { return lhs.name == rhs.name } public func hash(into hasher: inout Hasher) { hasher.combine(name) } public var description: String { return name } } // MARK: - BannerPosition public enum BannerPosition: String { case top case bottom case start case end } // MARK: - ScreenOrientation public enum ScreenOrientation: Int { case portrait = 0 case landscape = 1 } public class LoadAdTimeoutError: FusionError { public var errorCode: Int { return -100001 } public var message: String { return "Load ad timeout" } public var cause: Error? { return nil } public var info: String? { return nil } public var waterfallName: String? { return nil } } public class LoadAdRequestError: FusionError { public var errorCode: Int { return -100002 } public let message: String public var cause: Error? { return nil } public var info: String? { return nil } public var waterfallName: String? { return nil } init(message: String = "Load Ad Request Error") { self.message = message } } public class ShowAdTimeoutError: FusionError { public var errorCode: Int { return -100003 } public var message: String { return "Show Ad Timeout Error" } public var cause: Error? { return nil } public var info: String? { return nil } public var waterfallName: String? { return nil } } public class ShowAdRequestError: FusionError { public var errorCode: Int { return -100004 } public let message: String public var cause: Error? { return nil } public var info: String? { return nil } public var waterfallName: String? { return nil } init(message: String = "Show Ad Request Error") { self.message = message } } public class LoadAdNotAvailableError: FusionError { public var errorCode: Int { return -100005 } public let message: String public var cause: Error? { return nil } public var info: String? { return nil } public var waterfallName: String? { return nil } init(message: String = "Load Ad Not Avaialable Error") { self.message = message } } // MARK: - InvalidFusionAd public class InvalidFusionAd: FusionAd { public override var adPlatform: AdPlatform { return AdPlatform.invalid } public override var adUnitId: String? { return "" } public override var revenue: Double { return 0.0 } public override var waterfallName: String? { return "" } public override var placement: String? { return "" } public override var networkName: String? { return "" } public override var networkPlacement: String? { return "" } public override var creativeId: String? { return "" } public override var adReviewCreativeId: String? { return "" } private override init(engineId: Int, adType: AdType) { super.init(engineId: engineId, adType: adType) } public static func banner(engineId: Int) -> InvalidFusionAd { return InvalidFusionAd(engineId: engineId, adType: AdType.Banner) } public static func interstitial(engineId: Int) -> InvalidFusionAd { return InvalidFusionAd(engineId: engineId, adType: AdType.Interstitial) } public static func rewarded(engineId: Int) -> InvalidFusionAd { return InvalidFusionAd(engineId: engineId, adType: AdType.Rewarded) } public static func mRec(engineId: Int) -> InvalidFusionAd { return InvalidFusionAd(engineId: engineId, adType: AdType.MRec) } }