github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/mccp/mccpv2/paginate.go (about)

     1  package mccpv2
     2  
     3  import (
     4  	"encoding/json"
     5  	"reflect"
     6  	"strings"
     7  )
     8  
     9  type GenericPaginatedResourcesHandler struct {
    10  	resourceType reflect.Type
    11  }
    12  
    13  func NewCCPaginatedResources(resource interface{}) GenericPaginatedResourcesHandler {
    14  	return GenericPaginatedResourcesHandler{
    15  		resourceType: reflect.TypeOf(resource),
    16  	}
    17  }
    18  
    19  func (pr GenericPaginatedResourcesHandler) Resources(bytes []byte, curURL string) ([]interface{}, string, error) {
    20  	var paginatedResources = struct {
    21  		NextUrl        string          `json:"next_url"`
    22  		ResourcesBytes json.RawMessage `json:"resources"`
    23  	}{}
    24  
    25  	err := json.Unmarshal(bytes, &paginatedResources)
    26  
    27  	slicePtr := reflect.New(reflect.SliceOf(pr.resourceType))
    28  	dc := json.NewDecoder(strings.NewReader(string(paginatedResources.ResourcesBytes)))
    29  	dc.UseNumber()
    30  	err = dc.Decode(slicePtr.Interface())
    31  	slice := reflect.Indirect(slicePtr)
    32  
    33  	contents := make([]interface{}, 0, slice.Len())
    34  	for i := 0; i < slice.Len(); i++ {
    35  		contents = append(contents, slice.Index(i).Interface())
    36  	}
    37  
    38  	return contents, paginatedResources.NextUrl, err
    39  }