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 }