91 lines
2.1 KiB
Go
91 lines
2.1 KiB
Go
|
package statsapi
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"net/http"
|
||
|
"net/url"
|
||
|
)
|
||
|
|
||
|
var DefaultClient = NewClient(http.DefaultClient)
|
||
|
|
||
|
func Schedule(sportId, teamId string) (ScheduleResponse, error) {
|
||
|
return DefaultClient.Schedule(sportId, teamId)
|
||
|
}
|
||
|
|
||
|
func Feed(gamePk string) (FeedResponse, error) {
|
||
|
return DefaultClient.Feed(gamePk)
|
||
|
}
|
||
|
|
||
|
func DiffPatch(gamePk, startTimecode, pushUpdateId string) (DiffPatchResponse, error) {
|
||
|
return DefaultClient.DiffPatch(gamePk, startTimecode, pushUpdateId)
|
||
|
}
|
||
|
|
||
|
type Client struct {
|
||
|
baseURL url.URL
|
||
|
httpClient *http.Client
|
||
|
}
|
||
|
|
||
|
func NewClient(c *http.Client) *Client {
|
||
|
return &Client{
|
||
|
baseURL: url.URL{
|
||
|
Scheme: "https",
|
||
|
Host: "statsapi.mlb.com",
|
||
|
},
|
||
|
httpClient: c,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (c *Client) Schedule(sportId, teamId string) (ScheduleResponse, error) {
|
||
|
endpoint := url.URL{Path: "api/v1/schedule"}
|
||
|
query := endpoint.Query()
|
||
|
query.Add("sportId", sportId)
|
||
|
query.Add("teamId", teamId)
|
||
|
endpoint.RawQuery = query.Encode()
|
||
|
|
||
|
url := c.baseURL.ResolveReference(&endpoint)
|
||
|
|
||
|
var schedule ScheduleResponse
|
||
|
err := c.get(url.String(), &schedule)
|
||
|
return schedule, err
|
||
|
}
|
||
|
|
||
|
func (c *Client) Feed(gamePk string) (FeedResponse, error) {
|
||
|
endpoint := url.URL{Path: "api/v1.1/game/" + gamePk + "/feed/live"}
|
||
|
url := c.baseURL.ResolveReference(&endpoint)
|
||
|
|
||
|
var feed FeedResponse
|
||
|
err := c.get(url.String(), &feed)
|
||
|
return feed, err
|
||
|
}
|
||
|
|
||
|
func (c *Client) DiffPatch(gamePk, startTimecode, pushUpdateId string) (DiffPatchResponse, error) {
|
||
|
endpoint := url.URL{Path: "api/v1.1/game/" + gamePk + "/feed/live/diffPatch"}
|
||
|
query := endpoint.Query()
|
||
|
query.Add("language", "en")
|
||
|
query.Add("startTimecode", startTimecode)
|
||
|
query.Add("pushUpdateId", pushUpdateId)
|
||
|
endpoint.RawQuery = query.Encode()
|
||
|
|
||
|
url := c.baseURL.ResolveReference(&endpoint)
|
||
|
|
||
|
var diffPatch DiffPatchResponse
|
||
|
err := c.get(url.String(), &diffPatch)
|
||
|
return diffPatch, err
|
||
|
}
|
||
|
|
||
|
func (c *Client) get(url string, v any) error {
|
||
|
req, err := http.NewRequest("GET", url, nil)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
resp, err := c.httpClient.Do(req)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
|
||
|
err = json.NewDecoder(resp.Body).Decode(v)
|
||
|
return err
|
||
|
}
|