package fabric import ( "encoding/json" "fmt" "net/http" "time" ) const ( apiBase = "https://meta.fabricmc.net/v2" userAgent = "benson/2.0 (github.com/hachem-wtf/benson)" ) type GameVersion struct { Version string `json:"version"` Stable bool `json:"stable"` } type LoaderVersion struct { Version string `json:"version"` Stable bool `json:"stable"` } type InstallerVersion struct { Version string `json:"version"` Stable bool `json:"stable"` } type Client struct { http *http.Client } func NewClient() *Client { return &Client{http: &http.Client{Timeout: 30 * time.Second}} } func (c *Client) get(path string, out any) error { req, err := http.NewRequest(http.MethodGet, apiBase+path, nil) if err != nil { return err } req.Header.Set("User-Agent", userAgent) resp, err := c.http.Do(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("fabric: %s returned %s", path, resp.Status) } return json.NewDecoder(resp.Body).Decode(out) } func (c *Client) GameVersions() ([]GameVersion, error) { var versions []GameVersion if err := c.get("/versions/game", &versions); err != nil { return nil, err } return versions, nil } func (c *Client) LoaderVersions() ([]LoaderVersion, error) { var versions []LoaderVersion if err := c.get("/versions/loader", &versions); err != nil { return nil, err } return versions, nil } func (c *Client) InstallerVersions() ([]InstallerVersion, error) { var versions []InstallerVersion if err := c.get("/versions/installer", &versions); err != nil { return nil, err } return versions, nil }