/
app.go
98 lines (76 loc) · 1.53 KB
/
app.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
98
package app
import (
"flag"
"fmt"
"github.com/evilwire/go-env"
"github.com/gin-gonic/gin"
"github.com/golang/glog"
"time"
)
type ServerMeta struct {
BuildTime time.Time `env:"BUILD_TIME" json:"build-time"`
GHash string `env:"GHASH" json:"ghash"`
Version string `env:"VERSION" json:"version"`
}
func MustGetServerMeta(env goenv.EnvReader) *ServerMeta {
marshaller := goenv.DefaultEnvMarshaler{
Environment: env,
}
meta := ServerMeta{}
marshalErr := marshaller.Unmarshal(&meta)
if marshalErr != nil {
panic(marshalErr)
}
return &meta
}
type Config struct {
}
func NewConfig(env goenv.EnvReader) *Config {
return &Config{}
}
func setupFlags() {
flag.Parse()
}
func Setup(env goenv.EnvReader) (*App, error) {
setupFlags()
config := NewConfig(env)
meta := MustGetServerMeta(env)
server := newWebServer(config, meta)
return &App{
server,
}, nil
}
type webserver struct {
*gin.Engine
Meta *ServerMeta
}
func newWebServer(config *Config, meta *ServerMeta) *webserver {
engine := gin.New()
server := &webserver{
Engine: engine,
Meta: meta,
}
engine.GET("/meta", server.meta)
return server
}
func (server *webserver) meta(c *gin.Context) {
c.JSON(200, struct {
Meta *ServerMeta `json:"meta"`
}{
Meta: server.Meta,
})
}
func (server *webserver) Run() error {
return server.Engine.Run()
}
type App struct {
*webserver
}
func (app *App) Run() error {
go app.webserver.Run()
for range time.Tick(1 * time.Second) {
glog.Info("Printing hello world")
fmt.Println("Hello world!")
}
return nil
}