func (r *RetryObjectIterator) Next() (*storage.ObjectAttrs, error) {
	return objectAttributeRetry(r.Retry, func() (*storage.ObjectAttrs, error) {
		return r.iterator.Next()
	})
}
Next returns the next result, wrapped in retry. Its second return value is iterator.Done if
there are no more results. Once Next returns iterator.Done, all subsequent
calls will return iterator.Done.

If Query.Delimiter is non-empty, some of the ObjectAttrs returned by Next will
have a non-empty Prefix field, and a zero value for all other fields. These
represent prefixes.
package gs
import (
	"context"
	"cloud.google.com/go/storage"
	"github.com/c2fo/vfs/v6"
)
type BucketHandle interface {
	Attrs(ctx context.Context) (*storage.BucketAttrs, error)
}
type BucketHandleWrapper interface {
	BucketHandle
	WrappedObjects(ctx context.Context, q *storage.Query) ObjectIteratorWrapper
}
type RetryBucketHandler struct {
	Retry   vfs.Retry
	handler *storage.BucketHandle
}
func (r *RetryBucketHandler) Attrs(ctx context.Context) (*storage.BucketAttrs, error) {
	return bucketAttributeRetry(r.Retry, func() (*storage.BucketAttrs, error) {
		return r.handler.Attrs(ctx)
	})
}
func (r *RetryBucketHandler) WrappedObjects(ctx context.Context, q *storage.Query) ObjectIteratorWrapper {
	return &RetryObjectIterator{Retry: r.Retry, iterator: r.handler.Objects(ctx, q)}
}
type ObjectIteratorWrapper interface {
	Next() (*storage.ObjectAttrs, error)
}
type RetryObjectIterator struct {
	Retry    vfs.Retry
	iterator *storage.ObjectIterator
}