85 lines
1.6 KiB
Go
85 lines
1.6 KiB
Go
package godo
|
|
|
|
import (
|
|
"net/url"
|
|
"strconv"
|
|
|
|
"github.com/digitalocean/godo/context"
|
|
)
|
|
|
|
// Links manages links that are returned along with a List
|
|
type Links struct {
|
|
Pages *Pages `json:"pages,omitempty"`
|
|
Actions []LinkAction `json:"actions,omitempty"`
|
|
}
|
|
|
|
// Pages are pages specified in Links
|
|
type Pages struct {
|
|
First string `json:"first,omitempty"`
|
|
Prev string `json:"prev,omitempty"`
|
|
Last string `json:"last,omitempty"`
|
|
Next string `json:"next,omitempty"`
|
|
}
|
|
|
|
// LinkAction is a pointer to an action
|
|
type LinkAction struct {
|
|
ID int `json:"id,omitempty"`
|
|
Rel string `json:"rel,omitempty"`
|
|
HREF string `json:"href,omitempty"`
|
|
}
|
|
|
|
// CurrentPage is current page of the list
|
|
func (l *Links) CurrentPage() (int, error) {
|
|
return l.Pages.current()
|
|
}
|
|
|
|
func (p *Pages) current() (int, error) {
|
|
switch {
|
|
case p == nil:
|
|
return 1, nil
|
|
case p.Prev == "" && p.Next != "":
|
|
return 1, nil
|
|
case p.Prev != "":
|
|
prevPage, err := pageForURL(p.Prev)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return prevPage + 1, nil
|
|
}
|
|
|
|
return 0, nil
|
|
}
|
|
|
|
// IsLastPage returns true if the current page is the last
|
|
func (l *Links) IsLastPage() bool {
|
|
if l.Pages == nil {
|
|
return true
|
|
}
|
|
return l.Pages.isLast()
|
|
}
|
|
|
|
func (p *Pages) isLast() bool {
|
|
return p.Last == ""
|
|
}
|
|
|
|
func pageForURL(urlText string) (int, error) {
|
|
u, err := url.ParseRequestURI(urlText)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
pageStr := u.Query().Get("page")
|
|
page, err := strconv.Atoi(pageStr)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return page, nil
|
|
}
|
|
|
|
// Get a link action by id.
|
|
func (la *LinkAction) Get(ctx context.Context, client *Client) (*Action, *Response, error) {
|
|
return client.Actions.Get(ctx, la.ID)
|
|
}
|