blob: 58e24a28d7c5bed6baf86ae9715075cc14ebf5a1 [file] [log] [blame]
Philipp Schraderd9096a32022-02-24 17:53:09 -08001// This binary lets users interact with the scouting web server in order to
2// debug it. Run with `--help` to see all the options.
3
4package main
5
6import (
7 "flag"
8 "io/ioutil"
9 "log"
10 "os"
11 "os/exec"
12 "path/filepath"
13
Philipp Schraderd3fac192022-03-02 20:35:46 -080014 "github.com/davecgh/go-spew/spew"
Philipp Schraderd9096a32022-02-24 17:53:09 -080015 "github.com/frc971/971-Robot-Code/scouting/webserver/requests/debug"
16)
17
18// Returns the absolute path of the specified path. This is an unwrapped
19// version of `filepath.Abs`.
20func absPath(path string) string {
21 result, err := filepath.Abs(path)
22 if err != nil {
23 log.Fatal("Failed to determine absolute path for ", path, ": ", err)
24 }
25 return result
26}
27
28// Parses the specified JSON file into a binary version (i.e. serialized
29// flatbuffer). This uses the `flatc` binary and the JSON's corresponding
30// `.fbs` file.
31func parseJson(fbsPath string, jsonPath string) []byte {
32 // Work inside a temporary directory since `flatc` doesn't allow us to
33 // customize the name of the output file.
34 dir, err := ioutil.TempDir("", "webserver_debug_cli")
35 if err != nil {
36 log.Fatal("Failed to create temporary directory: ", err)
37 }
38 defer os.RemoveAll(dir)
39
40 // Turn these paths absolute so that it everything still works from
41 // inside the temporary directory.
42 absFlatcPath := absPath("external/com_github_google_flatbuffers/flatc")
43 absFbsPath := absPath(fbsPath)
44
45 // Create a symlink to the .fbs file so that the output filename that
46 // `flatc` generates is predictable. I.e. `fb.json` gets serialized
47 // into `fb.bin`.
48 jsonSymlink := filepath.Join(dir, "fb.json")
49 os.Symlink(jsonPath, jsonSymlink)
50
51 // Execute the `flatc` command.
52 flatcCommand := exec.Command(absFlatcPath, "--binary", absFbsPath, jsonSymlink)
53 flatcCommand.Dir = dir
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080054 output, err := flatcCommand.CombinedOutput()
Philipp Schraderd9096a32022-02-24 17:53:09 -080055 if err != nil {
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080056 log.Fatal("Failed to execute flatc: ", err, ": ", string(output))
Philipp Schraderd9096a32022-02-24 17:53:09 -080057 }
58
59 // Read the serialized flatbuffer and return it.
60 binaryPath := filepath.Join(dir, "fb.bin")
61 binaryFb, err := os.ReadFile(binaryPath)
62 if err != nil {
63 log.Fatal("Failed to read flatc output ", binaryPath, ": ", err)
64 }
65 return binaryFb
66}
67
Philipp Schrader02ec8e42022-03-26 16:37:18 -070068func maybePerformRequest[T interface{}](fbName, fbsPath, requestJsonPath, address string, requester func(string, []byte) (*T, error)) {
69 if requestJsonPath != "" {
70 log.Printf("Sending %s to %s", fbName, address)
71 binaryRequest := parseJson(fbsPath, requestJsonPath)
72 response, err := requester(address, binaryRequest)
73 if err != nil {
74 log.Fatalf("Failed %s: %v", fbName, err)
75 }
76 spew.Dump(*response)
77 }
78}
79
Philipp Schraderd9096a32022-02-24 17:53:09 -080080func main() {
81 // Parse command line arguments.
Philipp Schrader30005e42022-03-06 13:53:58 -080082 indentPtr := flag.String("indent", " ",
83 "The indentation to use for the result dumping. Default is a space.")
Philipp Schraderd9096a32022-02-24 17:53:09 -080084 addressPtr := flag.String("address", "http://localhost:8080",
85 "The end point where the server is listening.")
86 submitDataScoutingPtr := flag.String("submitDataScouting", "",
87 "If specified, parse the file as a SubmitDataScouting JSON request.")
Filip Kujawaf882e022022-12-14 13:14:08 -080088 submitDriverRankingPtr := flag.String("submitDriverRanking", "",
89 "If specified, parse the file as a submitDriverRanking JSON request.")
90 submitNotesPtr := flag.String("submitNotes", "",
91 "If specified, parse the file as a submitNotes JSON request.")
Philipp Schradercbf5c6a2022-02-27 23:25:19 -080092 requestAllMatchesPtr := flag.String("requestAllMatches", "",
93 "If specified, parse the file as a RequestAllMatches JSON request.")
Philipp Schraderacf96232022-03-01 22:03:30 -080094 requestDataScoutingPtr := flag.String("requestDataScouting", "",
95 "If specified, parse the file as a RequestDataScouting JSON request.")
Emily Markova290147d2023-03-03 22:40:06 -080096 request2023DataScoutingPtr := flag.String("request2023DataScouting", "",
97 "If specified, parse the file as a Request2023DataScouting JSON request.")
Filip Kujawaf882e022022-12-14 13:14:08 -080098 requestAllDriverRankingsPtr := flag.String("requestAllDriverRankings", "",
99 "If specified, parse the file as a requestAllDriverRankings JSON request.")
100 requestAllNotesPtr := flag.String("requestAllNotes", "",
101 "If specified, parse the file as a requestAllNotes JSON request.")
Philipp Schraderd9096a32022-02-24 17:53:09 -0800102 flag.Parse()
103
Philipp Schrader30005e42022-03-06 13:53:58 -0800104 spew.Config.Indent = *indentPtr
105
Philipp Schraderfe583842022-04-08 19:47:07 -0700106 // Disable pointer addresses. They're not useful for our purposes.
107 spew.Config.DisablePointerAddresses = true
108
Philipp Schraderd9096a32022-02-24 17:53:09 -0800109 // Handle the actual arguments.
Philipp Schrader02ec8e42022-03-26 16:37:18 -0700110 maybePerformRequest(
111 "SubmitDataScouting",
112 "scouting/webserver/requests/messages/submit_data_scouting.fbs",
113 *submitDataScoutingPtr,
114 *addressPtr,
115 debug.SubmitDataScouting)
116
117 maybePerformRequest(
Filip Kujawaf882e022022-12-14 13:14:08 -0800118 "submitNotes",
119 "scouting/webserver/requests/messages/submit_notes.fbs",
120 *submitNotesPtr,
121 *addressPtr,
122 debug.SubmitNotes)
123
124 maybePerformRequest(
125 "submitDriverRanking",
126 "scouting/webserver/requests/messages/submit_driver_ranking.fbs",
127 *submitDriverRankingPtr,
128 *addressPtr,
129 debug.SubmitDriverRanking)
130
131 maybePerformRequest(
Philipp Schrader02ec8e42022-03-26 16:37:18 -0700132 "RequestAllMatches",
133 "scouting/webserver/requests/messages/request_all_matches.fbs",
134 *requestAllMatchesPtr,
135 *addressPtr,
136 debug.RequestAllMatches)
137
138 maybePerformRequest(
Philipp Schrader02ec8e42022-03-26 16:37:18 -0700139 "RequestDataScouting",
140 "scouting/webserver/requests/messages/request_data_scouting.fbs",
141 *requestDataScoutingPtr,
142 *addressPtr,
143 debug.RequestDataScouting)
144
145 maybePerformRequest(
Emily Markova290147d2023-03-03 22:40:06 -0800146 "Request2023DataScouting",
147 "scouting/webserver/requests/messages/request_2023_data_scouting.fbs",
148 *request2023DataScoutingPtr,
149 *addressPtr,
150 debug.Request2023DataScouting)
151
152 maybePerformRequest(
Filip Kujawaf882e022022-12-14 13:14:08 -0800153 "requestAllDriverRankings",
154 "scouting/webserver/requests/messages/request_all_driver_rankings.fbs",
155 *requestAllDriverRankingsPtr,
156 *addressPtr,
157 debug.RequestAllDriverRankings)
158
159 maybePerformRequest(
160 "requestAllNotes",
161 "scouting/webserver/requests/messages/request_all_notes.fbs",
162 *requestAllNotesPtr,
163 *addressPtr,
164 debug.RequestAllNotes)
Philipp Schraderd9096a32022-02-24 17:53:09 -0800165}