Merge pull request #1 from programaths/develop
Better abstraction & https://golang.org/doc/effective_go.html#commentaryapi/rm-interface
commit
654ecca4c5
|
@ -6,11 +6,11 @@ import (
|
|||
)
|
||||
|
||||
type request struct {
|
||||
c *Client
|
||||
p string
|
||||
v url.Values
|
||||
fdClient *client
|
||||
path string
|
||||
urlValues url.Values
|
||||
}
|
||||
|
||||
func (r request) doJson(method string) (*json.Decoder, ResponseMeta, error) {
|
||||
return r.c.doJson(method, r.p, r.v)
|
||||
return r.fdClient.doJson(method, r.path, r.urlValues)
|
||||
}
|
||||
|
|
46
client.go
46
client.go
|
@ -15,24 +15,52 @@ Provides a high-level client to talk to the API that football-data.org offers.
|
|||
|
||||
To create an instance please use NewClient(h).
|
||||
*/
|
||||
type Client struct {
|
||||
h *http.Client
|
||||
type Client interface {
|
||||
Fixture(id uint64) FixtureRequest
|
||||
Fixtures() FixturesRequest
|
||||
SoccerSeason(id uint64) SoccerSeasonRequest
|
||||
FixturesOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonFixturesRequest
|
||||
LeagueTableOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonLeagueTableRequest
|
||||
TeamsOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonTeamsRequest
|
||||
SoccerSeasons() SoccerSeasonsRequest
|
||||
Team(id uint64) TeamRequest
|
||||
FixturesOfTeam(id uint64) TeamFixturesRequest
|
||||
|
||||
SetToken(authToken string)
|
||||
}
|
||||
|
||||
/*
|
||||
Provides a high-level client implementation to talk to the API that football-data.org offers.
|
||||
|
||||
To create an instance please use NewClient(h).
|
||||
*/
|
||||
type client struct {
|
||||
httpClient *http.Client
|
||||
|
||||
// Insert an API token here if you have one. It will be sent across with all requests.
|
||||
AuthToken string
|
||||
AuthToken string
|
||||
}
|
||||
|
||||
// Creates a new Client instance that wraps around the given HTTP client.
|
||||
func NewClient(h *http.Client) *Client {
|
||||
return &Client{h: h}
|
||||
// NewClient Creates a new Client instance that wraps around the given HTTP client.
|
||||
//
|
||||
// Call SetToken to add your token.
|
||||
func NewClient(h *http.Client) Client {
|
||||
return &client{httpClient: h}
|
||||
}
|
||||
|
||||
func (c *Client) req(path string, pathValues ...interface{}) request {
|
||||
// SetToken Set the authentication token
|
||||
// Calling this method is *optional*
|
||||
func (c* client) SetToken(authToken string) {
|
||||
c.AuthToken=authToken
|
||||
}
|
||||
|
||||
|
||||
func (c *client) req(path string, pathValues ...interface{}) request {
|
||||
return request{c, fmt.Sprintf(path, pathValues...), url.Values{}}
|
||||
}
|
||||
|
||||
// Executes an HTTP request with given parameters and on success returns the response wrapped in a JSON decoder.
|
||||
func (c *Client) doJson(method string, path string, values url.Values) (j *json.Decoder, meta ResponseMeta, err error) {
|
||||
func (c *client) doJson(method string, path string, values url.Values) (j *json.Decoder, meta ResponseMeta, err error) {
|
||||
// Create request
|
||||
req := &http.Request{
|
||||
Method: method,
|
||||
|
@ -48,7 +76,7 @@ func (c *Client) doJson(method string, path string, values url.Values) (j *json.
|
|||
req.Header.Set("User-Agent", "go-footballdata/0.0")
|
||||
|
||||
// Execute request
|
||||
resp, err := c.h.Do(req)
|
||||
resp, err := c.httpClient.Do(req)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ func Example() {
|
|||
client := footballdata.NewClient(http.DefaultClient)
|
||||
|
||||
// Tell it to use our API token
|
||||
client.AuthToken = "<insert your api token here>"
|
||||
client.SetToken("<insert your api token here>")
|
||||
|
||||
// Get list of seasons...
|
||||
seasons, err := client.SoccerSeasons().Do()
|
||||
|
|
|
@ -4,13 +4,13 @@ import "fmt"
|
|||
|
||||
type FixtureRequest struct{ request }
|
||||
|
||||
// Modifies the request to specify the number of former games to be analyzed (normally 10).
|
||||
// Head2Head Modifies the request to specify the number of former games to be analyzed (normally 10).
|
||||
func (r FixtureRequest) Head2Head(num uint16) FixtureRequest {
|
||||
r.v.Set("head2head", fmt.Sprintf("%d", num))
|
||||
r.urlValues.Set("head2head", fmt.Sprintf("%d", num))
|
||||
return r
|
||||
}
|
||||
|
||||
// Executes the request.
|
||||
// Do Executes the request.
|
||||
func (r FixtureRequest) Do() (s Fixture, err error) {
|
||||
d, _, err := r.doJson("GET")
|
||||
if err != nil {
|
||||
|
@ -21,7 +21,7 @@ func (r FixtureRequest) Do() (s Fixture, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// Prepares a request to fetch the fixtures of a soccer season.
|
||||
func (c *Client) Fixture(id uint64) FixtureRequest {
|
||||
// Fixture Prepares a request to fetch the fixtures of a soccer season.
|
||||
func (c *client) Fixture(id uint64) FixtureRequest {
|
||||
return FixtureRequest{c.req("fixture/%d", id)}
|
||||
}
|
||||
|
|
|
@ -7,19 +7,19 @@ import (
|
|||
|
||||
type FixturesRequest struct{ request }
|
||||
|
||||
// Modifies the request to specify a specific time frame.
|
||||
// TimeFrame Modifies the request to specify a specific time frame.
|
||||
func (r FixturesRequest) TimeFrame(timeframe time.Duration) FixturesRequest {
|
||||
r.v.Set("timeFrame", durationToTimeFrame(timeframe))
|
||||
r.urlValues.Set("timeFrame", durationToTimeFrame(timeframe))
|
||||
return r
|
||||
}
|
||||
|
||||
// Modifies the request to specify a list of leagues by their code.
|
||||
// League Modifies the request to specify a list of leagues by their code.
|
||||
func (r FixturesRequest) League(leagueCodes ...string) FixturesRequest {
|
||||
r.v.Set("league", strings.Join(leagueCodes, ","))
|
||||
r.urlValues.Set("league", strings.Join(leagueCodes, ","))
|
||||
return r
|
||||
}
|
||||
|
||||
// Executes the request.
|
||||
// Do Executes the request.
|
||||
func (r FixturesRequest) Do() (s FixturesResponse, err error) {
|
||||
d, _, err := r.doJson("GET")
|
||||
if err != nil {
|
||||
|
@ -30,7 +30,7 @@ func (r FixturesRequest) Do() (s FixturesResponse, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// Prepares a request to fetch the fixtures of a soccer season.
|
||||
func (c *Client) Fixtures() FixturesRequest {
|
||||
// Fixtures Prepares a request to fetch the fixtures of a soccer season.
|
||||
func (c *client) Fixtures() FixturesRequest {
|
||||
return FixturesRequest{c.req("fixtures")}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ package footballdata
|
|||
|
||||
type SoccerSeasonRequest struct{ request }
|
||||
|
||||
// Executes the request.
|
||||
// Do Executes the request.
|
||||
func (r SoccerSeasonRequest) Do() (s SoccerSeason, err error) {
|
||||
d, _, err := r.doJson("GET")
|
||||
if err != nil {
|
||||
|
@ -13,7 +13,7 @@ func (r SoccerSeasonRequest) Do() (s SoccerSeason, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// Prepares a request to fetch the complete list of soccer seasons.
|
||||
func (c *Client) SoccerSeason(id uint64) SoccerSeasonRequest {
|
||||
// SoccerSeason Prepares a request to fetch the complete list of soccer seasons.
|
||||
func (c *client) SoccerSeason(id uint64) SoccerSeasonRequest {
|
||||
return SoccerSeasonRequest{c.req("soccerseasons/%d", id)}
|
||||
}
|
||||
|
|
|
@ -7,19 +7,19 @@ import (
|
|||
|
||||
type SoccerSeasonFixturesRequest struct{ request }
|
||||
|
||||
// Modifies the request to specify a match day.
|
||||
// Matchday Modifies the request to specify a match day.
|
||||
func (r SoccerSeasonFixturesRequest) Matchday(matchday uint16) SoccerSeasonFixturesRequest {
|
||||
r.v.Set("matchday", fmt.Sprintf("%d", matchday))
|
||||
r.urlValues.Set("matchday", fmt.Sprintf("%d", matchday))
|
||||
return r
|
||||
}
|
||||
|
||||
// Modifies the request to specify a specific time frame.
|
||||
// TimeFrame Modifies the request to specify a specific time frame.
|
||||
func (r SoccerSeasonFixturesRequest) TimeFrame(timeframe time.Duration) SoccerSeasonFixturesRequest {
|
||||
r.v.Set("timeFrame", durationToTimeFrame(timeframe))
|
||||
r.urlValues.Set("timeFrame", durationToTimeFrame(timeframe))
|
||||
return r
|
||||
}
|
||||
|
||||
// Executes the request.
|
||||
// Do Executes the request.
|
||||
func (r SoccerSeasonFixturesRequest) Do() (s FixtureList, err error) {
|
||||
d, _, err := r.doJson("GET")
|
||||
if err != nil {
|
||||
|
@ -30,7 +30,7 @@ func (r SoccerSeasonFixturesRequest) Do() (s FixtureList, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// Prepares a request to fetch the fixtures of a soccer season.
|
||||
func (c *Client) FixturesOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonFixturesRequest {
|
||||
// FixturesOfSoccerSeason Prepares a request to fetch the fixtures of a soccer season.
|
||||
func (c *client) FixturesOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonFixturesRequest {
|
||||
return SoccerSeasonFixturesRequest{c.req("soccerseasons/%d/fixtures", soccerSeasonId)}
|
||||
}
|
||||
|
|
|
@ -4,13 +4,13 @@ import "fmt"
|
|||
|
||||
type SoccerSeasonLeagueTableRequest struct{ request }
|
||||
|
||||
// Modifies the request to specify a match day.
|
||||
// Matchday Modifies the request to specify a match day.
|
||||
func (r SoccerSeasonLeagueTableRequest) Matchday(matchday uint16) SoccerSeasonLeagueTableRequest {
|
||||
r.v.Set("matchday", fmt.Sprintf("%d", matchday))
|
||||
r.urlValues.Set("matchday", fmt.Sprintf("%d", matchday))
|
||||
return r
|
||||
}
|
||||
|
||||
// Executes the request.
|
||||
// Do Executes the request.
|
||||
func (r SoccerSeasonLeagueTableRequest) Do() (s SoccerSeason, err error) {
|
||||
d, _, err := r.doJson("GET")
|
||||
if err != nil {
|
||||
|
@ -21,7 +21,7 @@ func (r SoccerSeasonLeagueTableRequest) Do() (s SoccerSeason, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// Prepares a new request to fetch the league table of a given soccer season.
|
||||
func (c *Client) LeagueTableOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonLeagueTableRequest {
|
||||
// LeagueTableOfSoccerSeason Prepares a new request to fetch the league table of a given soccer season.
|
||||
func (c *client) LeagueTableOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonLeagueTableRequest {
|
||||
return SoccerSeasonLeagueTableRequest{c.req("soccerseasons/%d/leagueTable", soccerSeasonId)}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ package footballdata
|
|||
|
||||
type SoccerSeasonTeamsRequest struct{ request }
|
||||
|
||||
// Executes the request.
|
||||
// Do Executes the request.
|
||||
func (r SoccerSeasonTeamsRequest) Do() (s TeamList, err error) {
|
||||
d, _, err := r.doJson("GET")
|
||||
if err != nil {
|
||||
|
@ -13,7 +13,7 @@ func (r SoccerSeasonTeamsRequest) Do() (s TeamList, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// Prepares a new request to fetch the league table of a given soccer season.
|
||||
func (c *Client) TeamsOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonTeamsRequest {
|
||||
// TeamsOfSoccerSeason Prepares a new request to fetch the league table of a given soccer season.
|
||||
func (c *client) TeamsOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonTeamsRequest {
|
||||
return SoccerSeasonTeamsRequest{c.req("soccerseasons/%d/leagueTable", soccerSeasonId)}
|
||||
}
|
||||
|
|
|
@ -4,13 +4,13 @@ import "fmt"
|
|||
|
||||
type SoccerSeasonsRequest struct{ request }
|
||||
|
||||
// Modifies the request to specify a season.
|
||||
// Season Modifies the request to specify a season.
|
||||
func (r SoccerSeasonsRequest) Season(num uint32) SoccerSeasonsRequest {
|
||||
r.v.Set("season", fmt.Sprintf("%d", num))
|
||||
r.urlValues.Set("season", fmt.Sprintf("%d", num))
|
||||
return r
|
||||
}
|
||||
|
||||
// Executes the request.
|
||||
// Do Executes the request.
|
||||
func (r SoccerSeasonsRequest) Do() (s SoccerSeasonList, err error) {
|
||||
d, _, err := r.doJson("GET")
|
||||
if err != nil {
|
||||
|
@ -21,7 +21,7 @@ func (r SoccerSeasonsRequest) Do() (s SoccerSeasonList, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// Prepares a request to fetch the complete list of soccer seasons.
|
||||
func (c *Client) SoccerSeasons() SoccerSeasonsRequest {
|
||||
// SoccerSeasons Prepares a request to fetch the complete list of soccer seasons.
|
||||
func (c *client) SoccerSeasons() SoccerSeasonsRequest {
|
||||
return SoccerSeasonsRequest{c.req("soccerseasons")}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ type TeamRequest struct {
|
|||
id uint64
|
||||
}
|
||||
|
||||
// Executes the request.
|
||||
// Do Executes the request.
|
||||
func (r TeamRequest) Do() (s Team, err error) {
|
||||
d, _, err := r.doJson("GET")
|
||||
if err != nil {
|
||||
|
@ -20,7 +20,7 @@ func (r TeamRequest) Do() (s Team, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// Prepares a request to fetch a team's information.
|
||||
func (c *Client) Team(id uint64) TeamRequest {
|
||||
// Team Prepares a request to fetch a team's information.
|
||||
func (c *client) Team(id uint64) TeamRequest {
|
||||
return TeamRequest{c.req("teams/%d", id), id}
|
||||
}
|
||||
|
|
|
@ -7,25 +7,25 @@ import (
|
|||
|
||||
type TeamFixturesRequest struct{ request }
|
||||
|
||||
// Modifies the request to specify a specific time frame.
|
||||
// TimeFrame Modifies the request to specify a specific time frame.
|
||||
func (r TeamFixturesRequest) TimeFrame(timeframe time.Duration) TeamFixturesRequest {
|
||||
r.v.Set("timeFrame", durationToTimeFrame(timeframe))
|
||||
r.urlValues.Set("timeFrame", durationToTimeFrame(timeframe))
|
||||
return r
|
||||
}
|
||||
|
||||
// Modifies the request to specify a list of leagues by their code.
|
||||
// Season Modifies the request to specify a list of leagues by their code.
|
||||
func (r TeamFixturesRequest) Season(season uint64) TeamFixturesRequest {
|
||||
r.v.Set("season", fmt.Sprintf("%d", season))
|
||||
r.urlValues.Set("season", fmt.Sprintf("%d", season))
|
||||
return r
|
||||
}
|
||||
|
||||
// Modifies the request to specify a venue.
|
||||
// Venue Modifies the request to specify a venue.
|
||||
func (r TeamFixturesRequest) Venue(venue Venue) TeamFixturesRequest {
|
||||
r.v.Set("venue", string(venue))
|
||||
r.urlValues.Set("venue", string(venue))
|
||||
return r
|
||||
}
|
||||
|
||||
// Executes the request.
|
||||
// Do Executes the request.
|
||||
func (r TeamFixturesRequest) Do() (s FixturesResponse, err error) {
|
||||
d, _, err := r.doJson("GET")
|
||||
if err != nil {
|
||||
|
@ -36,7 +36,7 @@ func (r TeamFixturesRequest) Do() (s FixturesResponse, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// Prepares a request to fetch the fixtures of a soccer season.
|
||||
func (c *Client) FixturesOfTeam(id uint64) TeamFixturesRequest {
|
||||
// FixturesOfTeam Prepares a request to fetch the fixtures of a soccer season.
|
||||
func (c *client) FixturesOfTeam(id uint64) TeamFixturesRequest {
|
||||
return TeamFixturesRequest{c.req("teams/%d/fixtures", id)}
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ package footballdata
|
|||
|
||||
type TeamPlayersRequest struct{ request }
|
||||
|
||||
// Executes the request.
|
||||
// Do Executes the request.
|
||||
func (r TeamPlayersRequest) Do() (s PlayerList, err error) {
|
||||
d, _, err := r.doJson("GET")
|
||||
if err != nil {
|
||||
|
@ -13,7 +13,7 @@ func (r TeamPlayersRequest) Do() (s PlayerList, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// Prepares a request to fetch a team's players.
|
||||
func (c *Client) PlayersOfTeam(id uint64) TeamPlayersRequest {
|
||||
// PlayersOfTeam Prepares a request to fetch a team's players.
|
||||
func (c *client) PlayersOfTeam(id uint64) TeamPlayersRequest {
|
||||
return TeamPlayersRequest{c.req("teams/%d/players", id)}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue