1
0
mirror of https://github.com/taigrr/wtf synced 2025-01-18 04:03:14 -08:00
Chris Cummer 3d4059de02 go mod vendor update
Signed-off-by: Chris Cummer <chriscummer@me.com>
2019-12-14 08:52:34 -08:00

135 lines
3.8 KiB
Go

package spotify
import (
"errors"
"reflect"
)
// ErrNoMorePages is the error returned when you attempt to get the next
// (or previous) set of data but you've reached the end of the data set.
var ErrNoMorePages = errors.New("spotify: no more pages")
// This file contains the types that implement Spotify's paging object.
// See: https://developer.spotify.com/web-api/object-model/#paging-object
// basePage contains all of the fields in a Spotify paging object, except
// for the actual items. This type is meant to be embedded in other types
// that add the Items field.
type basePage struct {
// A link to the Web API Endpoint returning the full
// result of this request.
Endpoint string `json:"href"`
// The maximum number of items in the response, as set
// in the query (or default value if unset).
Limit int `json:"limit"`
// The offset of the items returned, as set in the query
// (or default value if unset).
Offset int `json:"offset"`
// The total number of items available to return.
Total int `json:"total"`
// The URL to the next page of items (if available).
Next string `json:"next"`
// The URL to the previous page of items (if available).
Previous string `json:"previous"`
}
// FullArtistPage contains FullArtists returned by the Web API.
type FullArtistPage struct {
basePage
Artists []FullArtist `json:"items"`
}
// SimpleAlbumPage contains SimpleAlbums returned by the Web API.
type SimpleAlbumPage struct {
basePage
Albums []SimpleAlbum `json:"items"`
}
// SavedAlbumPage contains SavedAlbums returned by the Web API.
type SavedAlbumPage struct {
basePage
Albums []SavedAlbum `json:"items"`
}
// SimplePlaylistPage contains SimplePlaylists returned by the Web API.
type SimplePlaylistPage struct {
basePage
Playlists []SimplePlaylist `json:"items"`
}
// SimpleTrackPage contains SimpleTracks returned by the Web API.
type SimpleTrackPage struct {
basePage
Tracks []SimpleTrack `json:"items"`
}
// FullTrackPage contains FullTracks returned by the Web API.
type FullTrackPage struct {
basePage
Tracks []FullTrack `json:"items"`
}
// SavedTrackPage contains SavedTracks return by the Web API.
type SavedTrackPage struct {
basePage
Tracks []SavedTrack `json:"items"`
}
// PlaylistTrackPage contains information about tracks in a playlist.
type PlaylistTrackPage struct {
basePage
Tracks []PlaylistTrack `json:"items"`
}
// CategoryPage contains Category objects returned by the Web API.
type CategoryPage struct {
basePage
Categories []Category `json:"items"`
}
// pageable is an internal interface for types that support paging
// by embedding basePage.
type pageable interface{ canPage() }
func (b basePage) canPage() {}
// NextPage fetches the next page of items and writes them into p.
// It returns ErrNoMorePages if p already contains the last page.
func (c *Client) NextPage(p pageable) error {
val := reflect.ValueOf(p).Elem()
field := val.FieldByName("Next")
nextURL := field.Interface().(string)
if len(nextURL) == 0 {
return ErrNoMorePages
}
// Zero out the page so that we can overwrite it in the next
// call to get. This is necessary because encoding/json does
// not clear out existing values when unmarshaling JSON null.
zero := reflect.Zero(val.Type())
val.Set(zero)
return c.get(nextURL, p)
}
// PreviousPage fetches the previous page of items and writes them into p.
// It returns ErrNoMorePages if p already contains the last page.
func (c *Client) PreviousPage(p pageable) error {
val := reflect.ValueOf(p).Elem()
field := val.FieldByName("Previous")
prevURL := field.Interface().(string)
if len(prevURL) == 0 {
return ErrNoMorePages
}
// Zero out the page so that we can overwrite it in the next
// call to get. This is necessary because encoding/json does
// not clear out existing values when unmarshaling JSON null.
zero := reflect.Zero(val.Type())
val.Set(zero)
return c.get(prevURL, p)
}