Sources/OSS/Paginator/ListBucketsPaginator.swift (40 lines of code) (raw):
/// A paginator for ListBuckets
public struct ListBucketsPaginator: AsyncSequence {
public typealias Element = ListBucketsResult
let client: Client
let request: ListBucketsRequest
public init(
client: Client,
request: ListBucketsRequest,
options: PaginatorOptions? = nil
) {
var request = request
if let limit = options?.limit {
request.maxKeys = limit
}
self.client = client
self.request = request
}
public struct AsyncIterator: AsyncIteratorProtocol {
let sequence: ListBucketsPaginator
var request: ListBucketsRequest?
init(sequence: ListBucketsPaginator) {
self.sequence = sequence
request = sequence.request
}
public mutating func next() async throws -> ListBucketsResult? {
if let request = request {
let result = try await sequence.client.listBuckets(request)
// has next page
if result.isTruncated ?? false {
self.request?.marker = result.nextMarker
} else {
self.request = nil
}
return result
}
return nil
}
}
public func makeAsyncIterator() -> AsyncIterator {
AsyncIterator(sequence: self)
}
}