github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/iam/iamv1/pagination.go (about) 1 package iamv1 2 3 import ( 4 "encoding/json" 5 "net/url" 6 "reflect" 7 "strings" 8 ) 9 10 const _PageTokenQuery = "pagetoken" 11 12 type IAMPaginatedResourcesHandler struct { 13 resourceType reflect.Type 14 } 15 16 func NewIAMPaginatedResources(resource interface{}) IAMPaginatedResourcesHandler { 17 return IAMPaginatedResourcesHandler{ 18 resourceType: reflect.TypeOf(resource), 19 } 20 } 21 22 func (pr IAMPaginatedResourcesHandler) Resources(bytes []byte, curPath string) ([]interface{}, string, error) { 23 var paginatedResources = struct { 24 NextPageToken string `json:"nextPageToken"` 25 ResourcesBytes json.RawMessage `json:"items"` 26 }{} 27 28 err := json.Unmarshal(bytes, &paginatedResources) 29 30 var nextPath string 31 if paginatedResources.NextPageToken != "" { 32 u, err := url.Parse(curPath) 33 if err == nil { 34 q := u.Query() 35 q.Set(_PageTokenQuery, paginatedResources.NextPageToken) 36 u.RawQuery = q.Encode() 37 nextPath = u.String() 38 } 39 } 40 41 slicePtr := reflect.New(reflect.SliceOf(pr.resourceType)) 42 dc := json.NewDecoder(strings.NewReader(string(paginatedResources.ResourcesBytes))) 43 dc.UseNumber() 44 err = dc.Decode(slicePtr.Interface()) 45 slice := reflect.Indirect(slicePtr) 46 47 contents := make([]interface{}, 0, slice.Len()) 48 for i := 0; i < slice.Len(); i++ { 49 contents = append(contents, slice.Index(i).Interface()) 50 } 51 return contents, nextPath, err 52 }