Files
atom/container/container.go
2023-06-09 14:32:21 +08:00

62 lines
1.1 KiB
Go

package container
import (
"context"
"log"
"os/signal"
"syscall"
"github.com/rogeecn/atom/utils/opt"
"github.com/spf13/viper"
"go.uber.org/dig"
)
var (
Container *dig.Container = dig.New()
Cancel context.CancelFunc
closeable []func()
)
func init() {
if err := Container.Provide(func() context.Context {
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
Cancel = cancel
return ctx
}); err != nil {
log.Fatal(err)
}
closeable = make([]func(), 0)
}
func AddCloseAble(c func()) {
closeable = append(closeable, c)
}
func Close() {
for _, c := range closeable {
c()
}
}
type ProviderContainer struct {
Provider func(...opt.Option) error
Options []opt.Option
}
type Providers []ProviderContainer
func (p Providers) With(pcs Providers) Providers {
return append(p, pcs...)
}
func (p Providers) Provide(config *viper.Viper) error {
for _, provider := range p {
provider.Options = append(provider.Options, opt.Config(config))
if err := provider.Provider(provider.Options...); err != nil {
return err
}
}
return nil
}