saerro-go/cmd/codegen-vehicles/main.go
2024-06-13 22:33:29 -04:00

100 lines
2 KiB
Go

// / Generate pkgs/translators/vehicles_map.gen.go
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"regexp"
"strings"
"time"
)
type VehicleResponse struct {
VehicleList []Vehicle `json:"vehicle_list"`
}
type Vehicle struct {
VehicleID string `json:"vehicle_id"`
Name LocaleString `json:"name"`
}
type LocaleString struct {
En string `json:"en"`
}
func fetchCensusVehicles() (VehicleResponse, error) {
var vehicleResponse VehicleResponse
client := http.Client{
Timeout: time.Second * 30,
}
resp, err := client.Get("https://census.lithafalcon.cc/get/ps2/vehicle")
if err != nil {
return vehicleResponse, fmt.Errorf("census request failed: %w", err)
}
err = json.NewDecoder(resp.Body).Decode(&vehicleResponse)
if err != nil {
return vehicleResponse, fmt.Errorf("census response decode failed: %w", err)
}
return vehicleResponse, nil
}
func generateRegexp(vehicles []string) *regexp.Regexp {
pipes := strings.Join(vehicles, "|")
expr := fmt.Sprintf("(%s)", pipes)
log.Println(expr)
return regexp.MustCompile(expr)
}
func main() {
filterRegexp := generateRegexp(AllVehicles)
censusVehicles, err := fetchCensusVehicles()
if err != nil {
log.Fatalln("fetch census failed", err)
}
vehicles := []VehicleItem{}
for _, vehicle := range censusVehicles.VehicleList {
if vehicle.Name.En == "" || strings.Contains(vehicle.Name.En, "Turret") {
continue
}
match := filterRegexp.FindString(strings.ToLower(vehicle.Name.En))
if match == "" {
continue
}
switch match {
case "wasp":
match = "valkyrie"
case "deliverer":
match = "ant"
case "lodestar":
match = "galaxy"
}
enumName := fmt.Sprintf("%s%s", strings.ToUpper(match[0:1]), match[1:])
vehicles = append(vehicles, VehicleItem{
VehicleID: vehicle.VehicleID,
VehicleEnumName: enumName,
})
}
output, err := renderTemplate(TemplateData{
Vehicles: vehicles,
})
if err != nil {
log.Fatalln("render failed", err)
}
fmt.Println(output)
}