github.com/IBM-Cloud/bluemix-go@v0.0.0-20240423071914-9e96525baef4/api/resource/resourcev1/catalog/pagination.go (about)

     1  package catalog
     2  
     3  import (
     4  	"encoding/json"
     5  	"reflect"
     6  	"strings"
     7  )
     8  
     9  type ResourceCatalogPaginatedResourcesHandler struct {
    10  	resourceType reflect.Type
    11  	baseURL      string
    12  }
    13  
    14  func NewResourceCatalogPaginatedResources(resource interface{}, baseURL string) ResourceCatalogPaginatedResourcesHandler {
    15  	return ResourceCatalogPaginatedResourcesHandler{
    16  		resourceType: reflect.TypeOf(resource),
    17  		baseURL:      baseURL,
    18  	}
    19  }
    20  
    21  func (pr ResourceCatalogPaginatedResourcesHandler) Resources(bytes []byte, curPath string) ([]interface{}, string, error) {
    22  	var paginatedResources = struct {
    23  		NextUrl        string          `json:"next"`
    24  		ResourcesBytes json.RawMessage `json:"resources"`
    25  	}{}
    26  
    27  	err := json.Unmarshal(bytes, &paginatedResources)
    28  
    29  	slicePtr := reflect.New(reflect.SliceOf(pr.resourceType))
    30  	dc := json.NewDecoder(strings.NewReader(string(paginatedResources.ResourcesBytes)))
    31  	dc.UseNumber()
    32  	err = dc.Decode(slicePtr.Interface())
    33  	slice := reflect.Indirect(slicePtr)
    34  
    35  	contents := make([]interface{}, 0, slice.Len())
    36  	for i := 0; i < slice.Len(); i++ {
    37  		contents = append(contents, slice.Index(i).Interface())
    38  	}
    39  	//The next URL in response is a full qualified URL like https://resource-catalog.stage1.ng.bluemix.net/api/v1?_offset=50&languages=en_US%2Cen
    40  	//So need to cut the baseURL from it.
    41  	index := strings.Index(paginatedResources.NextUrl, pr.baseURL)
    42  	//NextUrl contains baseURL, means need to cut
    43  	if index != -1 {
    44  		url := paginatedResources.NextUrl[index+len(pr.baseURL):]
    45  		return contents, url, err
    46  	}
    47  	return contents, paginatedResources.NextUrl, err
    48  }