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