github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/events/wait.go (about)

     1  package events
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/ActiveState/cli/internal/errs"
     8  	"github.com/ActiveState/cli/internal/logging"
     9  	"github.com/ActiveState/cli/internal/profile"
    10  )
    11  
    12  type EventsTimedOutError struct {
    13  }
    14  
    15  func (et *EventsTimedOutError) Timeout() bool {
    16  	return true
    17  }
    18  
    19  func (et *EventsTimedOutError) Error() string {
    20  	return "timed out waiting for events"
    21  }
    22  
    23  func Close(name string, closer func() error) {
    24  	if err := closer(); err != nil {
    25  		logging.Warning("Failed to close %s, error: %v", name, errs.JoinMessage(err))
    26  	}
    27  }
    28  
    29  func WaitForEvents(t time.Duration, events ...func()) error {
    30  	defer profile.Measure(fmt.Sprintf("event:WaitForEvents (%d)", len(events)), time.Now())
    31  	wg := make(chan struct{})
    32  	go func() {
    33  		defer profile.Measure("event:WaitForEvents:loop", time.Now())
    34  		for n, event := range events {
    35  			func() {
    36  				defer profile.Measure(fmt.Sprintf("event:WaitForEvents:%d", n), time.Now())
    37  				event()
    38  			}()
    39  		}
    40  		close(wg)
    41  	}()
    42  
    43  	select {
    44  	case <-time.After(t):
    45  		return &EventsTimedOutError{}
    46  	case <-wg:
    47  		return nil
    48  	}
    49  }
    50