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