-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboot.go
97 lines (80 loc) · 2.37 KB
/
boot.go
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
94
95
96
97
// Copyright 2024 github.com/lvan100
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package boot
import (
"log"
"github.com/lvan100/go-conf"
)
// BootstrapInterface is a bootstrap interface.
type BootstrapInterface interface {
doBeforeAppRun()
doAfterAppExit()
}
// BootstrapContext is a bootstrap context.
type BootstrapContext any
// Bootstrap is a bootstrap for app with some fixed steps.
type Bootstrap[T BootstrapContext] struct {
bootCtx T
Bootstrap func(bootCtx T)
InitConf func(bootCtx T)
InitLoggers func(bootCtx T)
InitClients func(bootCtx T)
CloseClients func(bootCtx T)
CloseLoggers func(bootCtx T)
Bootstrapper *conf.Bootstrapper
}
var _ BootstrapInterface = (*Bootstrap[any])(nil)
// NewBootstrap creates a new bootstrap.
func NewBootstrap[T BootstrapContext](bootCtx T) *Bootstrap[T] {
return &Bootstrap[T]{
bootCtx: bootCtx,
Bootstrapper: conf.NewBootstrapper(),
}
}
// Msg prints a message to the console.
func (bootstrap *Bootstrap[T]) Msg(msg string) {
log.Println("bootstrap: " + msg)
}
// doBeforeAppRun bootstraps before app run.
func (bootstrap *Bootstrap[T]) doBeforeAppRun() {
// config
if bootstrap.InitConf != nil {
bootstrap.Msg("init config")
bootstrap.InitConf(bootstrap.bootCtx)
}
// logger
if bootstrap.InitLoggers != nil {
bootstrap.Msg("init loggers")
bootstrap.InitLoggers(bootstrap.bootCtx)
}
// client
if bootstrap.InitClients != nil {
bootstrap.Msg("init clients")
bootstrap.InitClients(bootstrap.bootCtx)
}
bootstrap.Bootstrap(bootstrap.bootCtx)
}
// doAfterAppExit bootstraps after app exit.
func (bootstrap *Bootstrap[T]) doAfterAppExit() {
// client
if bootstrap.CloseClients != nil {
bootstrap.Msg("close clients")
bootstrap.CloseClients(bootstrap.bootCtx)
}
// logger
if bootstrap.CloseLoggers != nil {
bootstrap.Msg("close loggers")
bootstrap.CloseLoggers(bootstrap.bootCtx)
}
}