-
Notifications
You must be signed in to change notification settings - Fork 0
/
squad.go
86 lines (79 loc) · 1.68 KB
/
squad.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
package squad
import (
"fmt"
"github.com/sqdron/squad/configurator"
"github.com/sqdron/squad/connect"
"github.com/sqdron/squad/service"
"os"
"os/signal"
)
type ISquad interface {
Run()
}
type ClientOptions struct {
ID string
Hub string
Specification *bool
}
// squad is an isolated micro-service unit. Nobody knows about his existence but it knows about the entire world.
type squad struct {
ID string
Name string
Options *ClientOptions
Connect connect.ITransport
Api ISquadAPI
Bind ISquadBind
Spec *service.Specification
Instruction *service.Instruction
}
func Client(name string, options ...interface{}) *squad {
opts := &ClientOptions{}
cfg := configurator.New()
cfg.MapOptions(opts)
for _, o := range options {
cfg.MapOptions(o)
}
cfg.ReadOptions()
client := &squad{Options: opts}
client.Name = name
client.ID = opts.ID
client.Connect = connect.NatsTransport(opts.Hub)
client.Api = CreateApi(client.Connect)
client.Bind = CreateBind(client.Connect)
return client
}
func (s *squad) Run() <-chan bool {
fmt.Println("Run...")
if s.Options.Specification != nil && *s.Options.Specification == true {
s.register()
} else {
err := s.activate()
if err == nil {
s.Api.start(s.Instruction)
return s.start()
}
}
return nil
}
func (s *squad) start() <-chan bool {
exit := make(chan bool, 1)
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
//wg := sync.WaitGroup{}
//defer wg.Wait()
//wg.Add(1)
go func() {
for {
select {
case <-c:
fmt.Println("Interrupting...")
//wg.Done()
s.Api.stop()
exit <- true
os.Exit(1)
}
}
}()
//wg.Wait()
return exit
}