-
Notifications
You must be signed in to change notification settings - Fork 0
/
taurus.go
84 lines (73 loc) · 1.4 KB
/
taurus.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
package taurus
import (
"fmt"
"sync"
slog "github.com/eric-tech01/simple-log"
"github.com/eric-tech01/taurus/server"
"github.com/fatih/color"
)
type Application struct {
initOnce sync.Once
smu *sync.RWMutex
servers []server.Server
HideBanner bool
}
// Startup ..
func (app *Application) Startup(fns ...func() error) error {
app.initialize()
for _, fn := range fns {
if err := fn(); err != nil {
return err
}
}
return nil
}
// initialize application
func (app *Application) initialize() {
app.initOnce.Do(func() {
app.servers = make([]server.Server, 0)
app.smu = &sync.RWMutex{}
_ = app.printBanner()
})
}
// printBanner init
func (app *Application) printBanner() error {
if app.HideBanner {
return nil
}
const banner = `
_(_____)_
|__.___.__|
| |
| |
|_|
Welcome to taurus, starting application ...
`
fmt.Println(color.GreenString(banner))
return nil
}
// Serve start server
func (app *Application) Serve(s server.Server) error {
app.smu.Lock()
defer app.smu.Unlock()
app.servers = append(app.servers, s)
return nil
}
// Run run application
func (app *Application) Run() error {
app.smu.Lock()
defer app.smu.Unlock()
wg := sync.WaitGroup{}
for _, s := range app.servers {
wg.Add(1)
s := s
go func() {
defer wg.Done()
if err := s.Start(); err != nil {
slog.Error(err)
}
}()
}
wg.Wait()
return nil
}