github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/conf/presets/retry.go (about) 1 package presets 2 3 import ( 4 "time" 5 6 "github.com/sirupsen/logrus" 7 ) 8 9 type Retry struct { 10 Repeats int 11 Interval time.Duration 12 } 13 14 func (r Retry) MarshalDefaults(v interface{}) { 15 if retry, ok := v.(*Retry); ok { 16 if retry.Repeats == 0 { 17 retry.Repeats = 3 18 } 19 if retry.Interval == 0 { 20 retry.Interval = 10 * time.Second 21 } 22 } 23 } 24 25 func (r Retry) Do(exec func() error) (err error) { 26 if r.Repeats <= 0 { 27 err = exec() 28 return 29 } 30 for i := 0; i < r.Repeats; i++ { 31 err = exec() 32 if err != nil { 33 logrus.Warningf("retry in seconds [%d]", r.Interval) 34 time.Sleep(r.Interval) 35 } 36 } 37 return 38 }