github.com/rudderlabs/rudder-go-kit@v0.30.0/filemanager/iterator.go (about)

     1  package filemanager
     2  
     3  import "context"
     4  
     5  // IterateFilesWithPrefix returns an iterator that can be used to iterate over all files with the given prefix.
     6  func IterateFilesWithPrefix(ctx context.Context, prefix, startAfter string, maxItems int64, manager FileManager) *ObjectIterator {
     7  	it := &ObjectIterator{
     8  		session: manager.ListFilesWithPrefix(ctx, startAfter, prefix, maxItems),
     9  	}
    10  	return it
    11  }
    12  
    13  // NewListIterator returns a new iterator for the given list session.
    14  func NewListIterator(session ListSession) *ObjectIterator {
    15  	return &ObjectIterator{
    16  		session: session,
    17  	}
    18  }
    19  
    20  type ObjectIterator struct {
    21  	session ListSession
    22  
    23  	item  *FileInfo
    24  	items []*FileInfo
    25  	err   error
    26  }
    27  
    28  func (it *ObjectIterator) Next() bool {
    29  	var err error
    30  	if len(it.items) == 0 {
    31  		it.items, err = it.session.Next()
    32  		if err != nil {
    33  			it.err = err
    34  			return false
    35  		}
    36  	}
    37  
    38  	if len(it.items) > 0 {
    39  		it.item = it.items[0]
    40  		it.items = it.items[1:]
    41  		return true
    42  	}
    43  	return false
    44  }
    45  
    46  func (it *ObjectIterator) Get() *FileInfo {
    47  	return it.item
    48  }
    49  
    50  func (it *ObjectIterator) Err() error {
    51  	return it.err
    52  }