bettercap/vendor/github.com/evilsocket/islazy/async/timeout.go

30 lines
618 B
Go

package async
import (
"time"
)
// TimedCallback represents a generic function with a return value.
type TimedCallback func() interface{}
// WithTimeout will execute the callback and return its value or a
// ErrTimeout if its execution will exceed the provided duration.
func WithTimeout(tm time.Duration, cb TimedCallback) (interface{}, error) {
timeout := time.After(tm)
done := make(chan interface{})
go func() {
done <- cb()
}()
select {
case <-timeout:
return nil, ErrTimeout
case res := <-done:
if res != nil {
if e, ok := res.(error); ok {
return nil, e
}
}
return res, nil
}
}