//go:build ignore package main import ( "flag" "fmt" "io" "net/http" "os" "regexp" "github.com/ayn2op/arikawa/v3/api" ) const format = `// GENERATED BY go generate; DO NOT EDIT. package %s const clientBuildNumber = %s ` var buildNumberRegex = regexp.MustCompile(`"BUILD_NUMBER":\s*"(\d+)"`) func fetchBuildNumber() (string, error) { resp, err := http.Get(api.BaseEndpoint + "/login") if err != nil { return "", err } defer resp.Body.Close() if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices { return "", fmt.Errorf("failed to fetch login page; status=%q", resp.Status) } body, err := io.ReadAll(resp.Body) if err != nil { return "", err } matches := buildNumberRegex.FindSubmatch(body) if len(matches) < 2 { return "", fmt.Errorf("failed to find build number; matches=%v", matches) } return string(matches[1]), nil } func main() { out := flag.String("out", "generated.go", "out filename") flag.Parse() buildNumber, err := fetchBuildNumber() if err != nil { panic(err) } packageName := os.Getenv("GOPACKAGE") if packageName == "" { panic("GOPACKAGE is not set; run with go generate") } content := fmt.Appendf(nil, format, packageName, buildNumber) if err := os.WriteFile(*out, content, 0644); err != nil { panic(err) } }