Skip to content

Commit 3d0ffe1

Browse files
committed
Implement 'run' command
1 parent d12bf38 commit 3d0ffe1

File tree

3 files changed

+127
-22
lines changed

3 files changed

+127
-22
lines changed

main.go

Lines changed: 81 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,25 @@ import (
77
"strings"
88

99
"github.com/Bananenpro/cli"
10+
"github.com/Bananenpro/pflag"
1011
"github.com/code-game-project/codegame-cli-go/new/client"
1112
"github.com/code-game-project/codegame-cli-go/new/server"
12-
"github.com/spf13/pflag"
13+
"github.com/code-game-project/codegame-cli-go/run"
14+
"github.com/code-game-project/codegame-cli/util/cgfile"
1315
)
1416

1517
func main() {
16-
var gameName string
17-
pflag.StringVar(&gameName, "game-name", "", "The name of the game. (required for clients)")
18-
19-
var url string
20-
pflag.StringVar(&url, "url", "", "The URL of the game. (required for clients)")
21-
22-
var generateWrappers bool
23-
pflag.BoolVar(&generateWrappers, "generate-wrappers", false, "Whether to generate helper functions.")
24-
25-
var libraryVersion string
26-
pflag.StringVar(&libraryVersion, "library-version", "latest", "The version of the Go library to use, e.g. 0.8")
27-
2818
pflag.Usage = func() {
2919
fmt.Fprintf(os.Stderr, "Usage: %s <command> [...]\n", os.Args[0])
3020
fmt.Fprintln(os.Stderr, "\nCommands:")
3121
fmt.Fprintln(os.Stderr, "\tnew \tCreate a new project.")
22+
fmt.Fprintln(os.Stderr, "\trun \tRun the current project.")
3223
fmt.Fprintln(os.Stderr, "\nOptions:")
3324
pflag.PrintDefaults()
25+
fmt.Fprintln(os.Stderr, "This program expects to be executed inside of the project directory.")
3426
}
3527

36-
pflag.Parse()
37-
if pflag.NArg() < 2 {
28+
if len(os.Args) < 2 {
3829
pflag.Usage()
3930
os.Exit(1)
4031
}
@@ -45,11 +36,13 @@ func main() {
4536
}
4637
projectName := filepath.Base(workingDir)
4738

48-
command := strings.ToLower(pflag.Arg(0))
39+
command := strings.ToLower(os.Args[1])
4940

5041
switch command {
5142
case "new":
52-
err = new(projectName, gameName, url, libraryVersion, generateWrappers)
43+
err = newProject(projectName)
44+
case "run":
45+
err = runProject()
5346
default:
5447
err = cli.Error("Unknown command: %s\n", command)
5548
}
@@ -58,8 +51,33 @@ func main() {
5851
}
5952
}
6053

61-
func new(projectName, gameName, url, libraryVersion string, generateWrappers bool) error {
62-
projectType := strings.ToLower(pflag.Arg(1))
54+
func newProject(projectName string) error {
55+
flagSet := pflag.NewFlagSet("new", pflag.ExitOnError)
56+
57+
var gameName string
58+
flagSet.StringVar(&gameName, "game-name", "", "The name of the game. (required for `new client`)")
59+
60+
var url string
61+
flagSet.StringVar(&url, "url", "", "The URL of the game. (required for `new client`)")
62+
63+
var generateWrappers bool
64+
flagSet.BoolVar(&generateWrappers, "generate-wrappers", false, "Whether to generate helper functions. (used by `new client`)")
65+
66+
var libraryVersion string
67+
flagSet.StringVar(&libraryVersion, "library-version", "latest", "The version of the Go library to use, e.g. 0.8")
68+
69+
flagSet.Usage = func() {
70+
fmt.Fprintf(os.Stderr, "Usage: %s run [...]\n", os.Args[0])
71+
fmt.Fprintln(os.Stderr, "\nOptions:")
72+
flagSet.PrintDefaults()
73+
}
74+
flagSet.Parse(os.Args[2:])
75+
76+
if flagSet.NArg() == 0 {
77+
flagSet.Usage()
78+
os.Exit(1)
79+
}
80+
projectType := flagSet.Arg(0)
6381

6482
var err error
6583
switch projectType {
@@ -73,3 +91,47 @@ func new(projectName, gameName, url, libraryVersion string, generateWrappers boo
7391

7492
return err
7593
}
94+
95+
func runProject() error {
96+
flagSet := pflag.NewFlagSet("run", pflag.ExitOnError)
97+
flagSet.ParseErrorsWhitelist = pflag.ParseErrorsWhitelist{
98+
UnknownFlags: true,
99+
PassUnknownFlagsToArgs: true,
100+
}
101+
102+
var overrideURL string
103+
flagSet.StringVar(&overrideURL, "override-url", "", "The URL of the game. (required for `new client`)")
104+
105+
flagSet.Usage = func() {
106+
fmt.Fprintf(os.Stderr, "Usage: %s run [...]\n", os.Args[0])
107+
fmt.Fprintln(os.Stderr, "\nOptions:")
108+
flagSet.PrintDefaults()
109+
}
110+
flagSet.Parse(os.Args[2:])
111+
112+
projectRoot, err := cgfile.FindProjectRootRelative()
113+
if err != nil {
114+
return err
115+
}
116+
117+
data, err := cgfile.LoadCodeGameFile(projectRoot)
118+
if err != nil {
119+
return err
120+
}
121+
122+
url := data.URL
123+
if overrideURL != "" {
124+
url = overrideURL
125+
}
126+
127+
switch data.Type {
128+
case "client":
129+
err = run.RunClient(projectRoot, url, flagSet.Args()...)
130+
case "server":
131+
err = run.RunServer(projectRoot, flagSet.Args()...)
132+
default:
133+
err = cli.Error("Unknown project type: %s\n", data.Type)
134+
}
135+
136+
return err
137+
}

run/run.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package run
2+
3+
import (
4+
"os"
5+
"os/exec"
6+
"path/filepath"
7+
"strings"
8+
9+
"github.com/Bananenpro/cli"
10+
cgExec "github.com/code-game-project/codegame-cli/util/exec"
11+
)
12+
13+
func RunClient(projectRoot, url string, args ...string) error {
14+
cmdArgs := []string{"run", filepath.Join(projectRoot, "main.go")}
15+
cmdArgs = append(cmdArgs, args...)
16+
17+
env := []string{"CG_GAME_URL=" + url}
18+
env = append(env, os.Environ()...)
19+
20+
if _, err := exec.LookPath("go"); err != nil {
21+
cli.Error("'go' ist not installed!")
22+
return err
23+
}
24+
25+
cmd := exec.Command("go", cmdArgs...)
26+
cmd.Stdin = os.Stdin
27+
cmd.Stdout = os.Stdout
28+
cmd.Stderr = os.Stderr
29+
cmd.Env = env
30+
31+
err := cmd.Run()
32+
if err != nil {
33+
cli.Error("Failed to run 'CG_GAME_URL=%s go %s'", url, strings.Join(cmdArgs, " "))
34+
}
35+
return nil
36+
}
37+
38+
func RunServer(projectRoot string, args ...string) error {
39+
cmdArgs := []string{"run", filepath.Join(projectRoot, "main.go")}
40+
cmdArgs = append(cmdArgs, args...)
41+
_, err := cgExec.Execute(false, "go", cmdArgs...)
42+
return err
43+
}

versions.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{
22
"server": {
3-
"0.7": "0.4",
4-
"0.8": "0.4"
3+
"0.7": "0.5",
4+
"0.8": "0.5"
55
},
66
"client": {
7-
"0.8": "0.4"
7+
"0.8": "0.5"
88
}
99
}

0 commit comments

Comments
 (0)