enum BooruProvider: CaseIterable, Codable, Hashable, Equatable { case custom(BooruProviderCustom) case danbooru case gelbooru case konachan case safebooru case sakugabooru case yandere // MARK: - Computed Properties var domain: String { Self.domains[self] ?? rawValue.lowercased() } var asFileNameComponent: String { rawValue.lowercased().replacingOccurrences(of: ".", with: "_") } static var allCases: [Self] { [.danbooru, .gelbooru, .konachan, .safebooru, .sakugabooru, .yandere] } static func == (lhs: Self, rhs: Self) -> Bool { lhs.rawValue == rhs.rawValue } var rawValue: String { switch self { case .danbooru: "Danbooru" case .gelbooru: "Gelbooru" case .konachan: "Konachan.com" case .safebooru: "Safebooru" case .sakugabooru: "sakugabooru.com" case .yandere: "yande.re" case .custom(let provider): provider.baseURL } } // MARK: - Private private static let domains: [Self: String] = [ .yandere: "yande.re", .konachan: "konachan.com", .sakugabooru: "sakugabooru.com", .safebooru: "safebooru.org", .gelbooru: "gelbooru.com", .danbooru: "danbooru.donmai.us", ] }