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  }