| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- //
- // FallbackIndeedJobDataSource.swift
- // indeed_ai_job_search
- //
- // Tries the primary Indeed source first; if it succeeds with zero listings
- // (or fails with a soft network/parse error), uses the fallback source.
- //
- import Foundation
- import OSLog
- struct FallbackIndeedJobDataSource: IndeedJobDataSource {
- private static let log = Logger(
- subsystem: Bundle.main.bundleIdentifier ?? "indeed_ai_job_search",
- category: "IndeedFallback"
- )
- var primary: any IndeedJobDataSource
- var fallback: any IndeedJobDataSource
- func searchPage(
- criteria: SearchCriteria,
- query: String,
- page: IndeedSearchPageRequest
- ) async throws -> IndeedSearchPage {
- do {
- let primaryPage = try await primary.searchPage(
- criteria: criteria,
- query: query,
- page: page
- )
- if !primaryPage.listings.isEmpty || page.pageIndex > 0 {
- return primaryPage
- }
- Self.log.warning("Primary Indeed source returned 0 listings — trying fallback")
- } catch {
- Self.log.warning(
- "Primary Indeed source failed (\(error.localizedDescription, privacy: .public)) — trying fallback"
- )
- }
- return try await fallback.searchPage(
- criteria: criteria,
- query: query,
- page: page
- )
- }
- }
|