This repository has been archived by the owner on Oct 2, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
129 lines (112 loc) · 2.78 KB
/
main.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package main
import (
"flag"
"fmt"
"log"
"net/http"
"os"
"reflect"
"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
"github.com/go-chi/render"
yaml "gopkg.in/yaml.v2"
"github.com/gbevan/lucygw/handlers"
"github.com/gbevan/lucygw/jsonutils"
)
var (
serverPort int
config string
cfgYAML interface{}
)
func init() {
flag.IntVar(&serverPort, "port", 3303, "Port to listen on")
flag.StringVar(&config, "config", "./config.yaml", "Config file (json)")
}
func loadCfg() jsonutils.JSONMap {
file, err := os.Open(config)
if err != nil {
panic(err)
}
decoder := yaml.NewDecoder(file)
err = decoder.Decode(&cfgYAML)
if err != nil {
panic(err)
}
log.Printf("cfgYAML: %v", cfgYAML)
cfg := jsonutils.RecursiveToJSON(cfgYAML)
log.Printf("cfg: %v", cfg)
return cfg.(jsonutils.JSONMap)
}
func main() {
flag.Parse()
cfg := loadCfg()
// log.Printf("cfg: %v", cfg)
log.Printf("Site: %v", cfg["site"])
// log.Printf("Site Title: %v", cfg.Site.Title)
// log.Printf("Site Description: %v", cfg.Site.Description)
// log.Printf("Site Links: %v", cfg.Site.Links)
kafkaCfg := cfg["kafka"].(jsonutils.JSONMap)
handlers := handlers.Handlers{}
// handlers.Init(&cfg)
router := chi.NewRouter()
router.Use(
render.SetContentType(render.ContentTypeJSON),
middleware.Logger,
middleware.DefaultCompress,
middleware.RedirectSlashes,
middleware.Recoverer,
// authenticate,
)
// Default site doc
router.Get("/", func(w http.ResponseWriter, r *http.Request) {
siteDoc := jsonutils.JSONMap{
"site": cfg["site"],
"services": cfg["services"],
}
render.JSON(w, r, siteDoc)
})
// Establish service handlers
for _, s := range cfg["services"].(jsonutils.JSONArray) {
service := s.(jsonutils.JSONMap)
name := service["name"].(string)
path := service["path"].(string)
handler := service["handler"].(string)
requestTopic := service["request_topic"].(string)
responseTopic := service["response_topic"].(string)
log.Printf(
"loading service: %s at path %s with handler %s, topics(req/resp): %s/%s",
name,
path,
handler,
requestTopic,
responseTopic,
)
// Get Named handler for path mount
h := reflect.ValueOf(&handlers)
m := h.MethodByName(handler)
if !m.IsValid() {
panic(
fmt.Sprintf(
"Failed lookup of service handler '%s', from config yaml, in handlers module",
handler,
),
)
}
// Mount the service path
router.Mount(path, func() http.Handler {
// Call the service handler
return m.Call(
[]reflect.Value{
reflect.ValueOf(&service),
reflect.ValueOf(&kafkaCfg),
},
)[0].Interface().(http.Handler)
}())
}
log.Printf("lucygw listening on https port %d", serverPort)
// log.Fatal(http.ListenAndServeTLS(
log.Fatal(http.ListenAndServe(
fmt.Sprintf(":%d", serverPort),
router,
))
}