66 lines
1.8 KiB
Go
66 lines
1.8 KiB
Go
// 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())
|
|
}
|