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

     1  package iamuumv1
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/url"
     6  	"reflect"
     7  )
     8  
     9  type PaginatedResourcesHandler struct {
    10  	resourcesType reflect.Type
    11  }
    12  
    13  func NewPaginatedResourcesHandler(resources PaginatedResources) PaginatedResourcesHandler {
    14  	return PaginatedResourcesHandler{
    15  		resourcesType: reflect.TypeOf(resources).Elem(),
    16  	}
    17  }
    18  
    19  func (pr PaginatedResourcesHandler) Resources(bytes []byte, curPath string) ([]interface{}, string, error) {
    20  	paginatedResources := reflect.New(pr.resourcesType).Interface().(PaginatedResources)
    21  	err := json.Unmarshal(bytes, paginatedResources)
    22  
    23  	if err != nil {
    24  		return []interface{}{}, "", err
    25  	}
    26  
    27  	nextPath, err := paginatedResources.NextPath()
    28  
    29  	if err != nil {
    30  		return []interface{}{}, "", err
    31  	}
    32  
    33  	return paginatedResources.Resources(), nextPath, nil
    34  }
    35  
    36  type PaginationHref struct {
    37  	Href string `json:"href"`
    38  }
    39  
    40  type PaginationFields struct {
    41  	First    PaginationHref `json:"first"`
    42  	Last     PaginationHref `json:"last"`
    43  	Next     PaginationHref `json:"next"`
    44  	Previous PaginationHref `json:"previous"`
    45  
    46  	Offset     int `json:"offset"`
    47  	Limit      int `json:"limit"`
    48  	TotalCount int `json:"total_count"`
    49  }
    50  
    51  func (p *PaginationFields) NextPath() (string, error) {
    52  	if p.Next.Href == "" {
    53  		return "", nil
    54  	}
    55  
    56  	u, err := url.Parse(p.Next.Href)
    57  	if err == nil {
    58  		u.Scheme = ""
    59  		u.Opaque = ""
    60  		u.Host = ""
    61  		u.User = nil
    62  		return u.String(), nil
    63  	}
    64  	return "", err
    65  }
    66  
    67  type PaginatedResources interface {
    68  	NextPath() (string, error)
    69  	Resources() []interface{}
    70  }