Merge pull request #1 from programaths/develop

Better abstraction & https://golang.org/doc/effective_go.html#commentary
api/rm-interface
Icedream 2016-06-25 23:09:50 +02:00 committed by GitHub
commit 654ecca4c5
13 changed files with 92 additions and 64 deletions

View File

@ -6,11 +6,11 @@ import (
) )
type request struct { type request struct {
c *Client fdClient *client
p string path string
v url.Values urlValues url.Values
} }
func (r request) doJson(method string) (*json.Decoder, ResponseMeta, error) { 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)
} }

View File

@ -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). To create an instance please use NewClient(h).
*/ */
type Client struct { type Client interface {
h *http.Client 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. // 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. // NewClient Creates a new Client instance that wraps around the given HTTP client.
func NewClient(h *http.Client) *Client { //
return &Client{h: h} // 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{}} 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. // 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 // Create request
req := &http.Request{ req := &http.Request{
Method: method, 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") req.Header.Set("User-Agent", "go-footballdata/0.0")
// Execute request // Execute request
resp, err := c.h.Do(req) resp, err := c.httpClient.Do(req)
if err != nil { if err != nil {
return return
} }

View File

@ -12,7 +12,7 @@ func Example() {
client := footballdata.NewClient(http.DefaultClient) client := footballdata.NewClient(http.DefaultClient)
// Tell it to use our API token // 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... // Get list of seasons...
seasons, err := client.SoccerSeasons().Do() seasons, err := client.SoccerSeasons().Do()

View File

@ -4,13 +4,13 @@ import "fmt"
type FixtureRequest struct{ request } 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 { 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 return r
} }
// Executes the request. // Do Executes the request.
func (r FixtureRequest) Do() (s Fixture, err error) { func (r FixtureRequest) Do() (s Fixture, err error) {
d, _, err := r.doJson("GET") d, _, err := r.doJson("GET")
if err != nil { if err != nil {
@ -21,7 +21,7 @@ func (r FixtureRequest) Do() (s Fixture, err error) {
return return
} }
// Prepares a request to fetch the fixtures of a soccer season. // Fixture Prepares a request to fetch the fixtures of a soccer season.
func (c *Client) Fixture(id uint64) FixtureRequest { func (c *client) Fixture(id uint64) FixtureRequest {
return FixtureRequest{c.req("fixture/%d", id)} return FixtureRequest{c.req("fixture/%d", id)}
} }

View File

@ -7,19 +7,19 @@ import (
type FixturesRequest struct{ request } 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 { func (r FixturesRequest) TimeFrame(timeframe time.Duration) FixturesRequest {
r.v.Set("timeFrame", durationToTimeFrame(timeframe)) r.urlValues.Set("timeFrame", durationToTimeFrame(timeframe))
return r 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 { func (r FixturesRequest) League(leagueCodes ...string) FixturesRequest {
r.v.Set("league", strings.Join(leagueCodes, ",")) r.urlValues.Set("league", strings.Join(leagueCodes, ","))
return r return r
} }
// Executes the request. // Do Executes the request.
func (r FixturesRequest) Do() (s FixturesResponse, err error) { func (r FixturesRequest) Do() (s FixturesResponse, err error) {
d, _, err := r.doJson("GET") d, _, err := r.doJson("GET")
if err != nil { if err != nil {
@ -30,7 +30,7 @@ func (r FixturesRequest) Do() (s FixturesResponse, err error) {
return return
} }
// Prepares a request to fetch the fixtures of a soccer season. // Fixtures Prepares a request to fetch the fixtures of a soccer season.
func (c *Client) Fixtures() FixturesRequest { func (c *client) Fixtures() FixturesRequest {
return FixturesRequest{c.req("fixtures")} return FixturesRequest{c.req("fixtures")}
} }

View File

@ -2,7 +2,7 @@ package footballdata
type SoccerSeasonRequest struct{ request } type SoccerSeasonRequest struct{ request }
// Executes the request. // Do Executes the request.
func (r SoccerSeasonRequest) Do() (s SoccerSeason, err error) { func (r SoccerSeasonRequest) Do() (s SoccerSeason, err error) {
d, _, err := r.doJson("GET") d, _, err := r.doJson("GET")
if err != nil { if err != nil {
@ -13,7 +13,7 @@ func (r SoccerSeasonRequest) Do() (s SoccerSeason, err error) {
return return
} }
// Prepares a request to fetch the complete list of soccer seasons. // SoccerSeason Prepares a request to fetch the complete list of soccer seasons.
func (c *Client) SoccerSeason(id uint64) SoccerSeasonRequest { func (c *client) SoccerSeason(id uint64) SoccerSeasonRequest {
return SoccerSeasonRequest{c.req("soccerseasons/%d", id)} return SoccerSeasonRequest{c.req("soccerseasons/%d", id)}
} }

View File

@ -7,19 +7,19 @@ import (
type SoccerSeasonFixturesRequest struct{ request } 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 { 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 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 { func (r SoccerSeasonFixturesRequest) TimeFrame(timeframe time.Duration) SoccerSeasonFixturesRequest {
r.v.Set("timeFrame", durationToTimeFrame(timeframe)) r.urlValues.Set("timeFrame", durationToTimeFrame(timeframe))
return r return r
} }
// Executes the request. // Do Executes the request.
func (r SoccerSeasonFixturesRequest) Do() (s FixtureList, err error) { func (r SoccerSeasonFixturesRequest) Do() (s FixtureList, err error) {
d, _, err := r.doJson("GET") d, _, err := r.doJson("GET")
if err != nil { if err != nil {
@ -30,7 +30,7 @@ func (r SoccerSeasonFixturesRequest) Do() (s FixtureList, err error) {
return return
} }
// Prepares a request to fetch the fixtures of a soccer season. // FixturesOfSoccerSeason Prepares a request to fetch the fixtures of a soccer season.
func (c *Client) FixturesOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonFixturesRequest { func (c *client) FixturesOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonFixturesRequest {
return SoccerSeasonFixturesRequest{c.req("soccerseasons/%d/fixtures", soccerSeasonId)} return SoccerSeasonFixturesRequest{c.req("soccerseasons/%d/fixtures", soccerSeasonId)}
} }

View File

@ -4,13 +4,13 @@ import "fmt"
type SoccerSeasonLeagueTableRequest struct{ request } 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 { 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 return r
} }
// Executes the request. // Do Executes the request.
func (r SoccerSeasonLeagueTableRequest) Do() (s SoccerSeason, err error) { func (r SoccerSeasonLeagueTableRequest) Do() (s SoccerSeason, err error) {
d, _, err := r.doJson("GET") d, _, err := r.doJson("GET")
if err != nil { if err != nil {
@ -21,7 +21,7 @@ func (r SoccerSeasonLeagueTableRequest) Do() (s SoccerSeason, err error) {
return return
} }
// Prepares a new request to fetch the league table of a given soccer season. // LeagueTableOfSoccerSeason Prepares a new request to fetch the league table of a given soccer season.
func (c *Client) LeagueTableOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonLeagueTableRequest { func (c *client) LeagueTableOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonLeagueTableRequest {
return SoccerSeasonLeagueTableRequest{c.req("soccerseasons/%d/leagueTable", soccerSeasonId)} return SoccerSeasonLeagueTableRequest{c.req("soccerseasons/%d/leagueTable", soccerSeasonId)}
} }

View File

@ -2,7 +2,7 @@ package footballdata
type SoccerSeasonTeamsRequest struct{ request } type SoccerSeasonTeamsRequest struct{ request }
// Executes the request. // Do Executes the request.
func (r SoccerSeasonTeamsRequest) Do() (s TeamList, err error) { func (r SoccerSeasonTeamsRequest) Do() (s TeamList, err error) {
d, _, err := r.doJson("GET") d, _, err := r.doJson("GET")
if err != nil { if err != nil {
@ -13,7 +13,7 @@ func (r SoccerSeasonTeamsRequest) Do() (s TeamList, err error) {
return return
} }
// Prepares a new request to fetch the league table of a given soccer season. // TeamsOfSoccerSeason Prepares a new request to fetch the league table of a given soccer season.
func (c *Client) TeamsOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonTeamsRequest { func (c *client) TeamsOfSoccerSeason(soccerSeasonId uint64) SoccerSeasonTeamsRequest {
return SoccerSeasonTeamsRequest{c.req("soccerseasons/%d/leagueTable", soccerSeasonId)} return SoccerSeasonTeamsRequest{c.req("soccerseasons/%d/leagueTable", soccerSeasonId)}
} }

View File

@ -4,13 +4,13 @@ import "fmt"
type SoccerSeasonsRequest struct{ request } 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 { 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 return r
} }
// Executes the request. // Do Executes the request.
func (r SoccerSeasonsRequest) Do() (s SoccerSeasonList, err error) { func (r SoccerSeasonsRequest) Do() (s SoccerSeasonList, err error) {
d, _, err := r.doJson("GET") d, _, err := r.doJson("GET")
if err != nil { if err != nil {
@ -21,7 +21,7 @@ func (r SoccerSeasonsRequest) Do() (s SoccerSeasonList, err error) {
return return
} }
// Prepares a request to fetch the complete list of soccer seasons. // SoccerSeasons Prepares a request to fetch the complete list of soccer seasons.
func (c *Client) SoccerSeasons() SoccerSeasonsRequest { func (c *client) SoccerSeasons() SoccerSeasonsRequest {
return SoccerSeasonsRequest{c.req("soccerseasons")} return SoccerSeasonsRequest{c.req("soccerseasons")}
} }

View File

@ -5,7 +5,7 @@ type TeamRequest struct {
id uint64 id uint64
} }
// Executes the request. // Do Executes the request.
func (r TeamRequest) Do() (s Team, err error) { func (r TeamRequest) Do() (s Team, err error) {
d, _, err := r.doJson("GET") d, _, err := r.doJson("GET")
if err != nil { if err != nil {
@ -20,7 +20,7 @@ func (r TeamRequest) Do() (s Team, err error) {
return return
} }
// Prepares a request to fetch a team's information. // Team Prepares a request to fetch a team's information.
func (c *Client) Team(id uint64) TeamRequest { func (c *client) Team(id uint64) TeamRequest {
return TeamRequest{c.req("teams/%d", id), id} return TeamRequest{c.req("teams/%d", id), id}
} }

View File

@ -7,25 +7,25 @@ import (
type TeamFixturesRequest struct{ request } 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 { func (r TeamFixturesRequest) TimeFrame(timeframe time.Duration) TeamFixturesRequest {
r.v.Set("timeFrame", durationToTimeFrame(timeframe)) r.urlValues.Set("timeFrame", durationToTimeFrame(timeframe))
return r 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 { 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 return r
} }
// Modifies the request to specify a venue. // Venue Modifies the request to specify a venue.
func (r TeamFixturesRequest) Venue(venue Venue) TeamFixturesRequest { func (r TeamFixturesRequest) Venue(venue Venue) TeamFixturesRequest {
r.v.Set("venue", string(venue)) r.urlValues.Set("venue", string(venue))
return r return r
} }
// Executes the request. // Do Executes the request.
func (r TeamFixturesRequest) Do() (s FixturesResponse, err error) { func (r TeamFixturesRequest) Do() (s FixturesResponse, err error) {
d, _, err := r.doJson("GET") d, _, err := r.doJson("GET")
if err != nil { if err != nil {
@ -36,7 +36,7 @@ func (r TeamFixturesRequest) Do() (s FixturesResponse, err error) {
return return
} }
// Prepares a request to fetch the fixtures of a soccer season. // FixturesOfTeam Prepares a request to fetch the fixtures of a soccer season.
func (c *Client) FixturesOfTeam(id uint64) TeamFixturesRequest { func (c *client) FixturesOfTeam(id uint64) TeamFixturesRequest {
return TeamFixturesRequest{c.req("teams/%d/fixtures", id)} return TeamFixturesRequest{c.req("teams/%d/fixtures", id)}
} }

View File

@ -2,7 +2,7 @@ package footballdata
type TeamPlayersRequest struct{ request } type TeamPlayersRequest struct{ request }
// Executes the request. // Do Executes the request.
func (r TeamPlayersRequest) Do() (s PlayerList, err error) { func (r TeamPlayersRequest) Do() (s PlayerList, err error) {
d, _, err := r.doJson("GET") d, _, err := r.doJson("GET")
if err != nil { if err != nil {
@ -13,7 +13,7 @@ func (r TeamPlayersRequest) Do() (s PlayerList, err error) {
return return
} }
// Prepares a request to fetch a team's players. // PlayersOfTeam Prepares a request to fetch a team's players.
func (c *Client) PlayersOfTeam(id uint64) TeamPlayersRequest { func (c *client) PlayersOfTeam(id uint64) TeamPlayersRequest {
return TeamPlayersRequest{c.req("teams/%d/players", id)} return TeamPlayersRequest{c.req("teams/%d/players", id)}
} }