FallbackIndeedJobDataSource.swift 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. //
  2. // FallbackIndeedJobDataSource.swift
  3. // indeed_ai_job_search
  4. //
  5. // Tries the primary Indeed source first; if it succeeds with zero listings
  6. // (or fails with a soft network/parse error), uses the fallback source.
  7. //
  8. import Foundation
  9. import OSLog
  10. struct FallbackIndeedJobDataSource: IndeedJobDataSource {
  11. private static let log = Logger(
  12. subsystem: Bundle.main.bundleIdentifier ?? "indeed_ai_job_search",
  13. category: "IndeedFallback"
  14. )
  15. var primary: any IndeedJobDataSource
  16. var fallback: any IndeedJobDataSource
  17. func searchPage(
  18. criteria: SearchCriteria,
  19. query: String,
  20. page: IndeedSearchPageRequest
  21. ) async throws -> IndeedSearchPage {
  22. do {
  23. let primaryPage = try await primary.searchPage(
  24. criteria: criteria,
  25. query: query,
  26. page: page
  27. )
  28. if !primaryPage.listings.isEmpty || page.pageIndex > 0 {
  29. return primaryPage
  30. }
  31. Self.log.warning("Primary Indeed source returned 0 listings — trying fallback")
  32. } catch {
  33. Self.log.warning(
  34. "Primary Indeed source failed (\(error.localizedDescription, privacy: .public)) — trying fallback"
  35. )
  36. }
  37. return try await fallback.searchPage(
  38. criteria: criteria,
  39. query: query,
  40. page: page
  41. )
  42. }
  43. }