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 }