54 lines
810 B
Go
54 lines
810 B
Go
package tool
|
|
|
|
import (
|
|
"context"
|
|
"loveuer/utodo/pkg/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)
|
|
}
|