package servicecontext import ( "context" "errors" "git.yuntuo.hk/k2safe/go-omni/health" "git.yuntuo.hk/k2safe/go-omni/lifecycle" "git.yuntuo.hk/k2safe/go-omni/logx" {{if eq .Database "mysql"}}mysqladapter "git.yuntuo.hk/k2safe/go-omni/database/mysql"{{end}} "{{.Module}}/internal/settings" "{{.Module}}/internal/middleware" ) // New is generator-owned. Customize dependencies in ServiceContext.Init. func New(ctx context.Context,logger *logx.Logger,configs ...settings.Config)(result *Context,err error){ if ctx==nil{ctx=context.Background()} if err=ctx.Err();err!=nil{return nil,errors.Join(err,lifecycle.Cause(ctx))} if logger==nil{return nil,errors.New("service context requires a logger")} if len(configs)>1{return nil,errors.New("expected at most one configuration")} cfg:=settings.Default();if len(configs)==1{cfg=configs[0]} if err=cfg.Validate();err!=nil{return nil,err} checker,err:=health.New();if err!=nil{return nil,err} runtime,err:=lifecycle.NewRuntimeWithConfig(logx.WithLogger(ctx,logger),cfg.Server.Lifecycle);if err!=nil{return nil,err} c:=&Context{Config:cfg,Logger:logger,Health:checker,Middlewares:middleware.Defaults(),Runtime:runtime} ctx=logx.WithLogger(c.Context(),logger) defer func(){if p:=recover();p!=nil{_ = c.Close();panic(p)};if err!=nil{err=c.Finish(err)}}() {{if eq .Database "mysql"}} options:=append([]mysqladapter.Option{mysqladapter.WithLogger(logger)},c.DatabaseOptions()...) c.DB,err=mysqladapter.Open(ctx,cfg.Database,options...);if err!=nil{return nil,err} c.OnClose(c.DB.Close) if err=checker.Add(health.Probe{Name:"database",Timeout:cfg.Database.Pool.PingTimeout,Check:c.DB.Health});err!=nil{return nil,err} {{end}} {{if ne .Storage "none"}}if err=c.InitStorage(ctx,cfg.Storage);err!=nil{return nil,err}{{end}} if err=c.Init(ctx);err!=nil{return nil,err} return c,nil }