From d7e5378b5ec6e535d7a8cccaaee10951a73ee3fe Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Wed, 12 Aug 2015 18:07:20 -0700 Subject: [PATCH] Add Go client --- client/go/doc.go | 5 +++ client/go/episode.go | 18 +++++++++ client/go/get.go | 91 +++++++++++++++++++++++++++++++++++++++++++ client/go/get_test.go | 57 +++++++++++++++++++++++++++ 4 files changed, 171 insertions(+) create mode 100644 client/go/doc.go create mode 100644 client/go/episode.go create mode 100644 client/go/get.go create mode 100644 client/go/get_test.go diff --git a/client/go/doc.go b/client/go/doc.go new file mode 100644 index 0000000..4ee2abf --- /dev/null +++ b/client/go/doc.go @@ -0,0 +1,5 @@ +/* +Package ponyapi provides glue for applications written in Go +that want to use PonyAPI for getting information. +*/ +package ponyapi diff --git a/client/go/episode.go b/client/go/episode.go new file mode 100644 index 0000000..499b0d6 --- /dev/null +++ b/client/go/episode.go @@ -0,0 +1,18 @@ +package ponyapi + +// Episode is an episode of My Little Pony: Friendship is Magic. +type Episode struct { + AirDate int `json:"air_date"` + Episode int `json:"episode"` + IsMovie bool `json:"is_movie"` + Name string `json:"name"` + Season int `json:"season"` +} + +type episodeWrapper struct { + Episode *Episode `json:"episode"` +} + +type episodes struct { + Episodes []*Episode `json:"episodes"` +} diff --git a/client/go/get.go b/client/go/get.go new file mode 100644 index 0000000..5a58594 --- /dev/null +++ b/client/go/get.go @@ -0,0 +1,91 @@ +package ponyapi + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/url" +) + +const ( + endpoint = "http://ponyapi.apps.xeserv.us" +) + +func getJson(fragment string) (data []byte, err error) { + resp, err := http.Get(endpoint + fragment) + if err != nil { + return nil, err + } + + data, err = ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + return +} + +func getEpisode(fragment string) (*Episode, error) { + data, err := getJson(fragment) + if err != nil { + return nil, err + } + + ewr := &episodeWrapper{} + err = json.Unmarshal(data, ewr) + if err != nil { + return nil, err + } + + return ewr.Episode, nil +} + +func getEpisodes(fragment string) ([]*Episode, error) { + data, err := getJson(fragment) + if err != nil { + return nil, err + } + + eswr := &episodes{} + err = json.Unmarshal(data, eswr) + if err != nil { + return nil, err + } + + return eswr.Episodes, nil +} + +func Newest() (*Episode, error) { + return getEpisode("/newest") +} + +func Random() (*Episode, error) { + return getEpisode("/random") +} + +func GetEpisode(season, episode int) (*Episode, error) { + return getEpisode(fmt.Sprintf("/season/%d/episode/%d", season, episode)) +} + +func AllEpisodes() ([]*Episode, error) { + return getEpisodes("/all") +} + +func GetSeason(season int) ([]*Episode, error) { + return getEpisodes(fmt.Sprintf("/season/%d", season)) +} + +func Search(query string) ([]*Episode, error) { + path, err := url.Parse("/search") + if err != nil { + panic(err) + } + + q := path.Query() + q.Set("q", query) + + path.RawQuery = q.Encode() + + return getEpisodes(path.String()) +} diff --git a/client/go/get_test.go b/client/go/get_test.go new file mode 100644 index 0000000..a164f11 --- /dev/null +++ b/client/go/get_test.go @@ -0,0 +1,57 @@ +package ponyapi + +import "testing" + +func TestNewestEpisode(t *testing.T) { + ep, err := Newest() + if err != nil { + t.Fatal(err) + } + + t.Logf("%#v", ep) +} + +func TestRandomEpisode(t *testing.T) { + ep, err := Random() + if err != nil { + t.Fatal(err) + } + + t.Logf("%#v", ep) +} + +func TestSpecificEpisode(t *testing.T) { + ep, err := GetEpisode(2, 24) + if err != nil { + t.Fatal(err) + } + + t.Logf("%#v", ep) +} + +func TestAllEpisodes(t *testing.T) { + eps, err := AllEpisodes() + if err != nil { + t.Fatal(err) + } + + t.Logf("%d episodes", len(eps)) +} + +func TestGetSeason(t *testing.T) { + eps, err := GetSeason(4) + if err != nil { + t.Fatal(err) + } + + t.Logf("%d episodes", len(eps)) +} + +func TestSearch(t *testing.T) { + eps, err := Search("pony") + if err != nil { + t.Fatal(err) + } + + t.Logf("%#v", eps) +}