github.com/lingyao2333/mo-zero@v1.4.1/core/stores/mongo/iter.go (about)

     1  //go:generate mockgen -package mongo -destination iter_mock.go -source iter.go Iter
     2  
     3  package mongo
     4  
     5  import (
     6  	"github.com/globalsign/mgo/bson"
     7  	"github.com/lingyao2333/mo-zero/core/breaker"
     8  )
     9  
    10  type (
    11  	// Iter interface represents a mongo iter.
    12  	Iter interface {
    13  		All(result interface{}) error
    14  		Close() error
    15  		Done() bool
    16  		Err() error
    17  		For(result interface{}, f func() error) error
    18  		Next(result interface{}) bool
    19  		State() (int64, []bson.Raw)
    20  		Timeout() bool
    21  	}
    22  
    23  	// A ClosableIter is a closable mongo iter.
    24  	ClosableIter struct {
    25  		Iter
    26  		Cleanup func()
    27  	}
    28  
    29  	promisedIter struct {
    30  		Iter
    31  		promise keepablePromise
    32  	}
    33  
    34  	rejectedIter struct{}
    35  )
    36  
    37  func (i promisedIter) All(result interface{}) error {
    38  	return i.promise.keep(i.Iter.All(result))
    39  }
    40  
    41  func (i promisedIter) Close() error {
    42  	return i.promise.keep(i.Iter.Close())
    43  }
    44  
    45  func (i promisedIter) Err() error {
    46  	return i.Iter.Err()
    47  }
    48  
    49  func (i promisedIter) For(result interface{}, f func() error) error {
    50  	var ferr error
    51  	err := i.Iter.For(result, func() error {
    52  		ferr = f()
    53  		return ferr
    54  	})
    55  	if ferr == err {
    56  		return i.promise.accept(err)
    57  	}
    58  
    59  	return i.promise.keep(err)
    60  }
    61  
    62  // Close closes a mongo iter.
    63  func (it *ClosableIter) Close() error {
    64  	err := it.Iter.Close()
    65  	it.Cleanup()
    66  	return err
    67  }
    68  
    69  func (i rejectedIter) All(result interface{}) error {
    70  	return breaker.ErrServiceUnavailable
    71  }
    72  
    73  func (i rejectedIter) Close() error {
    74  	return breaker.ErrServiceUnavailable
    75  }
    76  
    77  func (i rejectedIter) Done() bool {
    78  	return false
    79  }
    80  
    81  func (i rejectedIter) Err() error {
    82  	return breaker.ErrServiceUnavailable
    83  }
    84  
    85  func (i rejectedIter) For(result interface{}, f func() error) error {
    86  	return breaker.ErrServiceUnavailable
    87  }
    88  
    89  func (i rejectedIter) Next(result interface{}) bool {
    90  	return false
    91  }
    92  
    93  func (i rejectedIter) State() (int64, []bson.Raw) {
    94  	return 0, nil
    95  }
    96  
    97  func (i rejectedIter) Timeout() bool {
    98  	return false
    99  }