package tool import ( "context" "gitea.loveuer.com/yizhisec/packages/logger" "sync" ) func Must(errs ...error) { for _, err := range errs { if err != nil { logger.Panic(err.Error()) } } } func MustWithData[T any](data T, err error) T { Must(err) return data } func MustStop(ctx context.Context, stopFns ...func(ctx context.Context) error) { if len(stopFns) == 0 { return } ok := make(chan struct{}) wg := &sync.WaitGroup{} wg.Add(len(stopFns)) for _, fn := range stopFns { go func() { defer wg.Done() if err := fn(ctx); err != nil { logger.ErrorCtx(ctx, "stop function failed, err = %s", err.Error()) } }() } go func() { select { case <-ctx.Done(): logger.FatalCtx(ctx, "stop function timeout, force down") case _, _ = <-ok: return } }() wg.Wait() close(ok) }