github.com/IBM-Cloud/bluemix-go@v0.0.0-20240314082800-4e02a69b84b2/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  }