/
main.go
93 lines (83 loc) · 2.41 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
// eX0-go is a work in progress Go implementation of eX0.
//
// The client runs as a native desktop app and in browser.
package main
import (
"flag"
"fmt"
"os"
"sync"
)
func usage() {
fmt.Fprintln(os.Stderr, `Usage: eX0-go [flags] [server]-[client]-[view]
Flags:`)
flag.PrintDefaults()
fmt.Fprintln(os.Stderr, "\nExample: eX0-go -host=example.com -name=shaGuar client-view")
}
func main() {
flag.Usage = usage
flag.Parse()
clientNetwork, ok := newClientNetwork()
if !ok {
flag.Usage()
os.Exit(2)
}
switch args := flag.Args(); {
case len(args) == 1 && args[0] == "server":
components.server = newServer()
startComponents()
select {}
case len(args) == 1 && args[0] == "client":
components.client = newClient(clientNetwork)
startComponents()
select {}
case len(args) == 1 && (args[0] == "server-client" || args[0] == "client-server"):
components.server = newServer()
components.client = newClient(clientNetwork)
startComponents()
select {}
case len(args) == 1 && args[0] == "server-view":
components.server = newServer()
components.view = newView(components.server.logic)
startComponents()
case len(args) == 1 && args[0] == "client-view":
components.client = newClient(clientNetwork)
components.view = newView(components.client.logic)
startComponents()
case len(args) == 1 && (args[0] == "server-client-view" || args[0] == "client-server-view"):
components.server = newServer()
components.client = newClient(clientNetwork)
components.view = newView(components.client.logic)
startComponents()
default:
flag.Usage()
os.Exit(2)
}
}
// components defines pieces of the program that will be executed.
// It must not be modified after startComponents is called, otherwise there'll be races.
var components struct {
server *server
client *client
view *view
}
func startComponents() {
if components.server != nil && components.client != nil && *hostFlag != "localhost" {
fmt.Fprintln(os.Stderr, "Host must be localhost if both server and client are started.")
fmt.Fprintln(os.Stderr)
flag.Usage()
os.Exit(2)
}
// By now, all components have been set, so it's safe to start them.
// Start server first, client second.
if components.server != nil {
components.server.start()
}
if components.client != nil {
components.client.start()
}
if components.view != nil {
components.view.initAndMainLoop()
}
}
var state sync.Mutex // TODO: Remove in favor of more specific mutexes.