// Code generated by go-omni api. DO NOT EDIT. package main import ( "context" "errors" "example.com/managed/internal/config" "example.com/managed/internal/handler" "example.com/managed/internal/svc" "flag" "git.yuntuo.hk/k2safe/go-omni/lifecycle" "git.yuntuo.hk/k2safe/go-omni/logx" "log" "os" "os/signal" "syscall" ) func main() { path := flag.String("config", "etc/config.yaml", "configuration file; empty uses only Default()") check := flag.Bool("check-config", false, "validate configuration and exit without starting dependencies") flag.Parse() if *check { if _, err := config.Load(*path); err != nil { log.Fatal(err) } return } ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() if err := run(ctx, *path); err != nil { log.Fatal(err) } } func run(ctx context.Context, path string) (runErr error) { cfg, err := config.Load(path) if err != nil { return err } logger, err := logx.New(cfg.Server.Log) if err != nil { return err } // Unjoined HTTP or background work may still log. The owning process exits on this // error; do not close its borrowed logger before that work has finished. defer func() { if !errors.Is(runErr, lifecycle.ErrResourcesRetained) { runErr = errors.Join(runErr, logger.Close()) } }() deps, err := svc.New(ctx, logger, cfg) if err != nil { return err } // Finish propagates incomplete HTTP draining: stop background work but retain // shared dependencies when any handler is still running. Otherwise close once. defer func() { runErr = deps.Finish(runErr) }() app, err := handler.NewApp(deps) if err != nil { return err } defer func() { runErr = errors.Join(runErr, app.Close()) }() logger.InfoContext(ctx, "service.starting", "address", app.Config().Address) return app.RunContext(deps.Lifecycle.Context()) }