-
Notifications
You must be signed in to change notification settings - Fork 85
/
pagination.go
39 lines (31 loc) · 1.05 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
package usermanagementv2
import (
"encoding/json"
"reflect"
"strings"
)
type GenericPaginatedResourcesHandler struct {
resourceType reflect.Type
}
func NewRCPaginatedResources(resource interface{}) GenericPaginatedResourcesHandler {
return GenericPaginatedResourcesHandler{
resourceType: reflect.TypeOf(resource),
}
}
func (pr GenericPaginatedResourcesHandler) Resources(bytes []byte, curURL string) ([]interface{}, string, error) {
var paginatedResources = struct {
NextUrl string `json:"next_url"`
ResourcesBytes json.RawMessage `json:"resources"`
}{}
err := json.Unmarshal(bytes, &paginatedResources)
slicePtr := reflect.New(reflect.SliceOf(pr.resourceType))
dc := json.NewDecoder(strings.NewReader(string(paginatedResources.ResourcesBytes)))
dc.UseNumber()
err = dc.Decode(slicePtr.Interface())
slice := reflect.Indirect(slicePtr)
contents := make([]interface{}, 0, slice.Len())
for i := 0; i < slice.Len(); i++ {
contents = append(contents, slice.Index(i).Interface())
}
return contents, paginatedResources.NextUrl, err
}