oss/client_paginators.go (321 lines of code) (raw):

package oss import ( "context" "fmt" ) type PaginatorOptions struct { // The maximum number of items in the response. Limit int32 } // ListObjectsPaginator is a paginator for ListObjects type ListObjectsPaginator struct { options PaginatorOptions client *Client request *ListObjectsRequest marker *string firstPage bool isTruncated bool } func (c *Client) NewListObjectsPaginator(request *ListObjectsRequest, optFns ...func(*PaginatorOptions)) *ListObjectsPaginator { if request == nil { request = &ListObjectsRequest{} } options := PaginatorOptions{} options.Limit = request.MaxKeys for _, fn := range optFns { fn(&options) } return &ListObjectsPaginator{ options: options, client: c, request: request, marker: request.Marker, firstPage: true, isTruncated: false, } } // HasNext Returns true if there’s a next page. func (p *ListObjectsPaginator) HasNext() bool { return p.firstPage || p.isTruncated } // NextPage retrieves the next ListObjects page. func (p *ListObjectsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListObjectsResult, error) { if !p.HasNext() { return nil, fmt.Errorf("no more pages available") } request := *p.request request.Marker = p.marker var limit int32 if p.options.Limit > 0 { limit = p.options.Limit } request.MaxKeys = limit request.EncodingType = Ptr("url") result, err := p.client.ListObjects(ctx, &request, optFns...) if err != nil { return nil, err } p.firstPage = false p.isTruncated = result.IsTruncated p.marker = result.NextMarker return result, nil } // ListObjectsV2Paginator is a paginator for ListObjectsV2 type ListObjectsV2Paginator struct { options PaginatorOptions client *Client request *ListObjectsV2Request continueToken *string firstPage bool isTruncated bool } func (c *Client) NewListObjectsV2Paginator(request *ListObjectsV2Request, optFns ...func(*PaginatorOptions)) *ListObjectsV2Paginator { if request == nil { request = &ListObjectsV2Request{} } options := PaginatorOptions{} options.Limit = request.MaxKeys for _, fn := range optFns { fn(&options) } return &ListObjectsV2Paginator{ options: options, client: c, request: request, continueToken: request.ContinuationToken, firstPage: true, isTruncated: false, } } // HasNext Returns true if there’s a next page. func (p *ListObjectsV2Paginator) HasNext() bool { return p.firstPage || p.isTruncated } // NextPage retrieves the next ListObjectsV2 page. func (p *ListObjectsV2Paginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListObjectsV2Result, error) { if !p.HasNext() { return nil, fmt.Errorf("no more pages available") } request := *p.request request.ContinuationToken = p.continueToken var limit int32 if p.options.Limit > 0 { limit = p.options.Limit } request.MaxKeys = limit request.EncodingType = Ptr("url") result, err := p.client.ListObjectsV2(ctx, &request, optFns...) if err != nil { return nil, err } p.firstPage = false p.isTruncated = result.IsTruncated p.continueToken = result.NextContinuationToken return result, nil } // ListObjectVersionsPaginator is a paginator for ListObjectVersions type ListObjectVersionsPaginator struct { options PaginatorOptions client *Client request *ListObjectVersionsRequest keyMarker *string versionIdMarker *string firstPage bool isTruncated bool } func (c *Client) NewListObjectVersionsPaginator(request *ListObjectVersionsRequest, optFns ...func(*PaginatorOptions)) *ListObjectVersionsPaginator { if request == nil { request = &ListObjectVersionsRequest{} } options := PaginatorOptions{} options.Limit = request.MaxKeys for _, fn := range optFns { fn(&options) } return &ListObjectVersionsPaginator{ options: options, client: c, request: request, keyMarker: request.KeyMarker, versionIdMarker: request.VersionIdMarker, firstPage: true, isTruncated: false, } } // HasNext Returns true if there’s a next page. func (p *ListObjectVersionsPaginator) HasNext() bool { return p.firstPage || p.isTruncated } // NextPage retrieves the next ListObjectVersions page. func (p *ListObjectVersionsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListObjectVersionsResult, error) { if !p.HasNext() { return nil, fmt.Errorf("no more pages available") } request := *p.request request.KeyMarker = p.keyMarker request.VersionIdMarker = p.versionIdMarker var limit int32 if p.options.Limit > 0 { limit = p.options.Limit } request.MaxKeys = limit request.EncodingType = Ptr("url") result, err := p.client.ListObjectVersions(ctx, &request, optFns...) if err != nil { return nil, err } p.firstPage = false p.isTruncated = result.IsTruncated p.keyMarker = result.NextKeyMarker p.versionIdMarker = result.NextVersionIdMarker return result, nil } // ListBucketsPaginator is a paginator for ListBuckets type ListBucketsPaginator struct { options PaginatorOptions client *Client request *ListBucketsRequest marker *string firstPage bool isTruncated bool } func (c *Client) NewListBucketsPaginator(request *ListBucketsRequest, optFns ...func(*PaginatorOptions)) *ListBucketsPaginator { if request == nil { request = &ListBucketsRequest{} } options := PaginatorOptions{} options.Limit = request.MaxKeys for _, fn := range optFns { fn(&options) } return &ListBucketsPaginator{ options: options, client: c, request: request, marker: request.Marker, firstPage: true, isTruncated: false, } } // HasNext Returns true if there’s a next page. func (p *ListBucketsPaginator) HasNext() bool { return p.firstPage || p.isTruncated } // NextPage retrieves the next ListBuckets page. func (p *ListBucketsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListBucketsResult, error) { if !p.HasNext() { return nil, fmt.Errorf("no more pages available") } request := *p.request request.Marker = p.marker var limit int32 if p.options.Limit > 0 { limit = p.options.Limit } request.MaxKeys = limit result, err := p.client.ListBuckets(ctx, &request, optFns...) if err != nil { return nil, err } p.firstPage = false p.isTruncated = result.IsTruncated p.marker = result.NextMarker return result, nil } type ListPartsAPIClient interface { ListParts(ctx context.Context, request *ListPartsRequest, optFns ...func(*Options)) (*ListPartsResult, error) } // ListPartsPaginator is a paginator for ListParts type ListPartsPaginator struct { options PaginatorOptions client ListPartsAPIClient request *ListPartsRequest marker int32 firstPage bool isTruncated bool } func NewListPartsPaginator(c ListPartsAPIClient, request *ListPartsRequest, optFns ...func(*PaginatorOptions)) *ListPartsPaginator { if request == nil { request = &ListPartsRequest{} } options := PaginatorOptions{} options.Limit = request.MaxParts for _, fn := range optFns { fn(&options) } return &ListPartsPaginator{ options: options, client: c, request: request, marker: request.PartNumberMarker, firstPage: true, isTruncated: false, } } func (c *Client) NewListPartsPaginator(request *ListPartsRequest, optFns ...func(*PaginatorOptions)) *ListPartsPaginator { return NewListPartsPaginator(c, request, optFns...) } // HasNext Returns true if there’s a next page. func (p *ListPartsPaginator) HasNext() bool { return p.firstPage || p.isTruncated } // NextPage retrieves the next ListParts page. func (p *ListPartsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListPartsResult, error) { if !p.HasNext() { return nil, fmt.Errorf("no more pages available") } request := *p.request request.PartNumberMarker = p.marker var limit int32 if p.options.Limit > 0 { limit = p.options.Limit } request.MaxParts = limit request.EncodingType = Ptr("url") result, err := p.client.ListParts(ctx, &request, optFns...) if err != nil { return nil, err } p.firstPage = false p.isTruncated = result.IsTruncated p.marker = result.NextPartNumberMarker return result, nil } // ListMultipartUploadsPaginator is a paginator for ListMultipartUploads type ListMultipartUploadsPaginator struct { options PaginatorOptions client *Client request *ListMultipartUploadsRequest keyMarker *string uploadIdMarker *string firstPage bool isTruncated bool } func (c *Client) NewListMultipartUploadsPaginator(request *ListMultipartUploadsRequest, optFns ...func(*PaginatorOptions)) *ListMultipartUploadsPaginator { if request == nil { request = &ListMultipartUploadsRequest{} } options := PaginatorOptions{} options.Limit = request.MaxUploads for _, fn := range optFns { fn(&options) } return &ListMultipartUploadsPaginator{ options: options, client: c, request: request, keyMarker: request.KeyMarker, uploadIdMarker: request.UploadIdMarker, firstPage: true, isTruncated: false, } } // HasNext Returns true if there’s a next page. func (p *ListMultipartUploadsPaginator) HasNext() bool { return p.firstPage || p.isTruncated } // NextPage retrieves the next ListMultipartUploads page. func (p *ListMultipartUploadsPaginator) NextPage(ctx context.Context, optFns ...func(*Options)) (*ListMultipartUploadsResult, error) { if !p.HasNext() { return nil, fmt.Errorf("no more pages available") } request := *p.request request.KeyMarker = p.keyMarker request.UploadIdMarker = p.uploadIdMarker var limit int32 if p.options.Limit > 0 { limit = p.options.Limit } request.MaxUploads = limit request.EncodingType = Ptr("url") result, err := p.client.ListMultipartUploads(ctx, &request, optFns...) if err != nil { return nil, err } p.firstPage = false p.isTruncated = result.IsTruncated p.keyMarker = result.NextKeyMarker p.uploadIdMarker = result.NextUploadIdMarker return result, nil }