github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/openstack/image/v2/images/List.go (about)

     1  package images
     2  
     3  import (
     4  	"net/url"
     5  	"strings"
     6  
     7  	"github.com/opentelekomcloud/gophertelekomcloud"
     8  	"github.com/opentelekomcloud/gophertelekomcloud/internal/extract"
     9  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/ims/v2/images"
    10  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/utils"
    11  	"github.com/opentelekomcloud/gophertelekomcloud/pagination"
    12  )
    13  
    14  // List implements image list request.
    15  func List(c *golangsdk.ServiceClient, opts images.ListImagesOpts) pagination.Pager {
    16  	url, err := golangsdk.NewURLBuilder().WithEndpoints("images").WithQueryParams(&opts).Build()
    17  	if err != nil {
    18  		return pagination.Pager{Err: err}
    19  	}
    20  
    21  	// GET /v2/images
    22  	return pagination.NewPager(c, c.ServiceURL(url.String()), func(r pagination.PageResult) pagination.Page {
    23  		return ImagePage{
    24  			serviceURL:     c.ServiceURL(),
    25  			LinkedPageBase: pagination.LinkedPageBase{PageResult: r},
    26  		}
    27  	})
    28  }
    29  
    30  // ImagePage represents the results of a List request.
    31  type ImagePage struct {
    32  	serviceURL string
    33  	pagination.LinkedPageBase
    34  }
    35  
    36  // IsEmpty returns true if an ImagePage contains no Images results.
    37  func (r ImagePage) IsEmpty() (bool, error) {
    38  	i, err := ExtractImages(r)
    39  	return len(i) == 0, err
    40  }
    41  
    42  // ExtractImages interprets the results of a single page from a List() call,
    43  // producing a slice of Image entities.
    44  func ExtractImages(r pagination.Page) ([]images.ImageInfo, error) {
    45  	var s struct {
    46  		Images []images.ImageInfo `json:"images"`
    47  	}
    48  	err := extract.Into(r.(ImagePage).BodyReader(), &s)
    49  	return s.Images, err
    50  }
    51  
    52  // NextPageURL uses the response's embedded link reference to navigate to
    53  // the next page of results.
    54  func (r ImagePage) NextPageURL() (string, error) {
    55  	var s struct {
    56  		Next string `json:"next"`
    57  	}
    58  	err := extract.Into(r.BodyReader(), &s)
    59  	if err != nil {
    60  		return "", err
    61  	}
    62  
    63  	if s.Next == "" {
    64  		return "", nil
    65  	}
    66  
    67  	return nextPageURL(r.serviceURL, s.Next)
    68  }
    69  
    70  func nextPageURL(serviceURL, requestedNext string) (string, error) {
    71  	base, err := utils.BaseEndpoint(serviceURL)
    72  	if err != nil {
    73  		return "", err
    74  	}
    75  
    76  	requestedNextURL, err := url.Parse(requestedNext)
    77  	if err != nil {
    78  		return "", err
    79  	}
    80  
    81  	base = golangsdk.NormalizeURL(base)
    82  	nextPath := base + strings.TrimPrefix(requestedNextURL.Path, "/")
    83  
    84  	nextURL, err := url.Parse(nextPath)
    85  	if err != nil {
    86  		return "", err
    87  	}
    88  
    89  	nextURL.RawQuery = requestedNextURL.RawQuery
    90  
    91  	return nextURL.String(), nil
    92  }