-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
101 lines (87 loc) · 2.05 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
package main
import (
"fmt"
"log"
"os"
"github.com/gin-gonic/gin"
"github.com/streamdp/ccd/clients"
"github.com/streamdp/ccd/clients/cryptocompare"
"github.com/streamdp/ccd/clients/huobi"
"github.com/streamdp/ccd/config"
"github.com/streamdp/ccd/db"
"github.com/streamdp/ccd/db/redis"
"github.com/streamdp/ccd/repos"
"github.com/streamdp/ccd/router"
)
func main() {
l := log.New(os.Stderr, "CCD:", log.LstdFlags)
config.ParseFlags()
gin.SetMode(config.RunMode)
d, err := db.Connect(l)
if err != nil {
l.Fatalln(err)
}
defer func() {
if err = d.Close(); err != nil {
l.Println(fmt.Errorf("failed to close database connection: %w", err))
}
}()
s := newSessionStore(d, l)
defer func() {
if err = s.Close(); err != nil {
l.Println(fmt.Errorf("failed to close session store: %w", err))
}
}()
sr := repos.NewSymbolRepository(d)
if err = sr.Load(); err != nil {
l.Fatalln(err)
}
r, err := initRestClient()
if err != nil {
l.Fatalln(err)
}
w, err := initWsClient(d, l)
if err != nil {
l.Fatalln(err)
}
p := clients.NewPuller(r, l, s, d.DataPipe())
if err = p.RestoreLastSession(); err != nil {
l.Println(fmt.Errorf("error restoring last session: %w", err))
}
e := gin.Default()
if err = router.InitRouter(e, d, l, sr, r, w, p); err != nil {
l.Fatalln(err)
}
if err = e.Run(config.Port); err != nil {
l.Fatalln(err)
}
}
func initRestClient() (r clients.RestClient, err error) {
switch config.DataProvider {
case "huobi":
return huobi.Init()
default:
return cryptocompare.Init()
}
}
func initWsClient(d db.Database, l *log.Logger) (w clients.WsClient, err error) {
switch config.DataProvider {
case "huobi":
return huobi.InitWs(d.DataPipe(), l)
default:
return cryptocompare.InitWs(d.DataPipe(), l)
}
}
func newSessionStore(d db.Database, l *log.Logger) (s db.Session) {
var err error
switch config.SessionStore {
case "redis":
s, err = redis.NewRedisKeysStore()
default:
s, err = repos.NewSessionRepo(d)
}
if err != nil {
l.Println(fmt.Errorf("failed to init session store: %w", err))
}
return
}