diff --git a/README.md b/README.md index e8d3dd1..f6dae69 100644 --- a/README.md +++ b/README.md @@ -600,12 +600,14 @@ _ = try await client.upsertSpaceVariable( The API automatically handles pagination using `Link` headers: ```swift -let page1 = try await client.listModels(limit: 100) -print("Page 1: \(page1.items.count) models") +var page = try await client.listModels(limit: 100) +print("Page 1: \(page.items.count) models") -// Get next page if available -if let nextURL = page1.nextURL { - // Make a request to nextURL to get the next page +while page.nextURL != nil { + guard let next = try await client.nextPage(of: page) else { break } + page = next + + print("Page: \(page.items.count) models") } ``` diff --git a/Sources/HuggingFace/Hub/HubClient+Pagination.swift b/Sources/HuggingFace/Hub/HubClient+Pagination.swift new file mode 100644 index 0000000..9a1bc54 --- /dev/null +++ b/Sources/HuggingFace/Hub/HubClient+Pagination.swift @@ -0,0 +1,17 @@ +// +// File 2.swift +// swift-huggingface +// +// Created by Ronald Mannak on 12/17/25. +// + +import Foundation + +extension HubClient { + public func nextPage( + of page: PaginatedResponse + ) async throws -> PaginatedResponse? { + guard let next = page.nextURL else { return nil } + return try await httpClient.fetchPaginated(.get, url: next) + } +} diff --git a/Sources/HuggingFace/Shared/HTTPClient.swift b/Sources/HuggingFace/Shared/HTTPClient.swift index 2a3ca5e..63e8667 100644 --- a/Sources/HuggingFace/Shared/HTTPClient.swift +++ b/Sources/HuggingFace/Shared/HTTPClient.swift @@ -113,7 +113,19 @@ final class HTTPClient: @unchecked Sendable { params: [String: Value]? = nil, headers: [String: String]? = nil ) async throws -> PaginatedResponse { - let request = try await createRequest(method, path, params: params, headers: headers) + guard let url = URL(string: path, relativeTo: host) else { + throw HTTPClientError.unexpectedError("Invalid URL") + } + return try await fetchPaginated(method, url: url, params: params, headers: headers) + } + + func fetchPaginated( + _ method: HTTPMethod, + url: URL, + params: [String: Value]? = nil, + headers: [String: String]? = nil + ) async throws -> PaginatedResponse { + let request = try await createRequest(method, url: url, params: params, headers: headers) let (data, response) = try await session.data(for: request) let httpResponse = try validateResponse(response, data: data)