github.com/andy2046/gopie@v0.7.0/pkg/deadline/deadline.go (about) 1 // Package deadline implements Deadline pattern. 2 package deadline 3 4 import ( 5 "errors" 6 "time" 7 ) 8 9 // ErrTimeout is the error for deadline timeout. 10 var ErrTimeout = errors.New("time out executing function") 11 12 // Deadline represents the deadline. 13 type Deadline struct { 14 timeout time.Duration 15 } 16 17 // New returns a new Deadline with the provided timeout. 18 func New(timeout time.Duration) *Deadline { 19 return &Deadline{ 20 timeout: timeout, 21 } 22 } 23 24 // Go executes the provided function with a done channel as parameter to signal the timeout. 25 func (d *Deadline) Go(fn func(<-chan struct{}) error) error { 26 result, done := make(chan error), make(chan struct{}) 27 28 go func() { 29 result <- fn(done) 30 }() 31 32 select { 33 case ret := <-result: 34 return ret 35 case <-time.After(d.timeout): 36 close(done) 37 return ErrTimeout 38 } 39 }