(ctx context.Context, bucketName string, opts ListObjectsOptions)
| 379 | } |
| 380 | |
| 381 | func (c *Client) listObjectVersions(ctx context.Context, bucketName string, opts ListObjectsOptions) iter.Seq[ObjectInfo] { |
| 382 | // Default listing is delimited at "/" |
| 383 | delimiter := "/" |
| 384 | if opts.Recursive { |
| 385 | // If recursive we do not delimit. |
| 386 | delimiter = "" |
| 387 | } |
| 388 | |
| 389 | return func(yield func(ObjectInfo) bool) { |
| 390 | if contextCanceled(ctx) { |
| 391 | return |
| 392 | } |
| 393 | |
| 394 | // Validate bucket name. |
| 395 | if err := s3utils.CheckValidBucketName(bucketName); err != nil { |
| 396 | yield(ObjectInfo{Err: err}) |
| 397 | return |
| 398 | } |
| 399 | |
| 400 | // Validate incoming object prefix. |
| 401 | if err := s3utils.CheckValidObjectNamePrefix(opts.Prefix); err != nil { |
| 402 | yield(ObjectInfo{Err: err}) |
| 403 | return |
| 404 | } |
| 405 | |
| 406 | var ( |
| 407 | keyMarker = opts.StartAfter |
| 408 | versionIDMarker = "" |
| 409 | preName = "" |
| 410 | preKey = "" |
| 411 | perVersions []Version |
| 412 | numVersions int |
| 413 | ) |
| 414 | |
| 415 | send := func(vers []Version) bool { |
| 416 | if opts.WithVersions && opts.ReverseVersions { |
| 417 | slices.Reverse(vers) |
| 418 | numVersions = len(vers) |
| 419 | } |
| 420 | for _, version := range vers { |
| 421 | info := ObjectInfo{ |
| 422 | ETag: trimEtag(version.ETag), |
| 423 | Key: version.Key, |
| 424 | LastModified: version.LastModified.Truncate(time.Millisecond), |
| 425 | Size: version.Size, |
| 426 | Owner: version.Owner, |
| 427 | StorageClass: version.StorageClass, |
| 428 | IsLatest: version.IsLatest, |
| 429 | VersionID: version.VersionID, |
| 430 | IsDeleteMarker: version.isDeleteMarker, |
| 431 | UserTags: version.UserTags, |
| 432 | UserMetadata: version.UserMetadata, |
| 433 | Internal: version.Internal, |
| 434 | NumVersions: numVersions, |
| 435 | ChecksumAlgorithm: version.ChecksumAlgorithm, |
| 436 | ChecksumMode: version.ChecksumType, |
| 437 | ChecksumCRC32: version.ChecksumCRC32, |
| 438 | ChecksumCRC32C: version.ChecksumCRC32C, |
no test coverage detected