forked from IBM-Cloud/bluemix-go
/
pagination.go
70 lines (56 loc) · 1.46 KB
/
pagination.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package iamuumv1
import (
"encoding/json"
"net/url"
"reflect"
)
type PaginatedResourcesHandler struct {
resourcesType reflect.Type
}
func NewPaginatedResourcesHandler(resources PaginatedResources) PaginatedResourcesHandler {
return PaginatedResourcesHandler{
resourcesType: reflect.TypeOf(resources).Elem(),
}
}
func (pr PaginatedResourcesHandler) Resources(bytes []byte, curPath string) ([]interface{}, string, error) {
paginatedResources := reflect.New(pr.resourcesType).Interface().(PaginatedResources)
err := json.Unmarshal(bytes, paginatedResources)
if err != nil {
return []interface{}{}, "", err
}
nextPath, err := paginatedResources.NextPath()
if err != nil {
return []interface{}{}, "", err
}
return paginatedResources.Resources(), nextPath, nil
}
type PaginationHref struct {
Href string `json:"href"`
}
type PaginationFields struct {
First PaginationHref `json:"first"`
Last PaginationHref `json:"last"`
Next PaginationHref `json:"next"`
Previous PaginationHref `json:"previous"`
Offset int `json:"offset"`
Limit int `json:"limit"`
TotalCount int `json:"total_count"`
}
func (p *PaginationFields) NextPath() (string, error) {
if p.Next.Href == "" {
return "", nil
}
u, err := url.Parse(p.Next.Href)
if err == nil {
u.Scheme = ""
u.Opaque = ""
u.Host = ""
u.User = nil
return u.String(), nil
}
return "", err
}
type PaginatedResources interface {
NextPath() (string, error)
Resources() []interface{}
}