discordo/internal/http/generator.go

66 lines
1.3 KiB
Go

//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)
}
}