-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
93 lines (84 loc) · 2.25 KB
/
main.go
File metadata and controls
93 lines (84 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package main
import (
"os"
"runtime"
"go.uber.org/zap"
_ "github.com/oferchen/lvmsync_go/cmd/dump"
rootcmd "github.com/oferchen/lvmsync_go/cmd/root"
"github.com/oferchen/lvmsync_go/internal/config"
"github.com/oferchen/lvmsync_go/internal/exitcode"
"github.com/oferchen/lvmsync_go/internal/logging"
)
// Runner executes the application with injected dependencies.
type Runner struct {
Configure func() (*config.Config, []string, *zap.Logger, error)
RunFunc func(*config.Config, []string, *zap.Logger) error
SyncLogger func(*zap.Logger)
Exit func(int)
ExampleLogger func() *zap.Logger
GOOS string
}
// NewRunner constructs a Runner with production dependencies.
func NewRunner() *Runner {
return &Runner{
Configure: rootcmd.Configure,
RunFunc: rootcmd.Run,
SyncLogger: rootcmd.SyncLogger,
Exit: os.Exit,
ExampleLogger: func() *zap.Logger {
logger, err := logging.NewLogger(nil, "main")
if err != nil {
return zap.NewNop()
}
return logger
},
GOOS: runtime.GOOS,
}
}
// NewRunnerWithDeps constructs a Runner with custom dependencies, useful for tests.
func NewRunnerWithDeps(
configure func() (*config.Config, []string, *zap.Logger, error),
run func(*config.Config, []string, *zap.Logger) error,
syncLogger func(*zap.Logger),
exit func(int),
exampleLogger func() *zap.Logger,
goos string,
) *Runner {
return &Runner{
Configure: configure,
RunFunc: run,
SyncLogger: syncLogger,
Exit: exit,
ExampleLogger: exampleLogger,
GOOS: goos,
}
}
// Run executes the configured application flow.
func (r *Runner) Run() {
if r.GOOS != "linux" {
tmpLogger := r.ExampleLogger()
tmpLogger.Error("unsupported platform", zap.String("goos", r.GOOS))
rootcmd.SyncLogger(tmpLogger)
r.Exit(1)
return
}
cfg, args, logger, err := r.Configure()
if err != nil {
tmpLogger := r.ExampleLogger()
tmpLogger.Error("configuration failed", zap.Error(err))
rootcmd.SyncLogger(tmpLogger)
r.Exit(rootcmd.ExitCode(err))
return
}
if err := r.RunFunc(cfg, args, logger); err != nil {
logger.Error("run failed", zap.Error(err))
r.SyncLogger(logger)
r.Exit(rootcmd.ExitCode(err))
return
}
r.SyncLogger(logger)
r.Exit(exitcode.OK)
}
func main() {
NewRunner().Run()
}