github.com/chnsz/golangsdk@v0.0.0-20240506093406-85a3fbfa605b/pagination/list_all.go (about)

     1  package pagination
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/chnsz/golangsdk"
     7  )
     8  
     9  // the query type that can be supported
    10  const (
    11  	Marker   string = "marker" // limit + marker
    12  	Offset          = "offset" // limit + offset
    13  	PageSize        = "page"   // pagesize + page
    14  )
    15  
    16  // QueryOpts is the operation for ListAllItems
    17  // currently, you can change the default marker field with `MarkerField`
    18  type QueryOpts struct {
    19  	MarkerField string
    20  }
    21  
    22  // ListAllItems is the method to get all pages from initialURL
    23  func ListAllItems(client *golangsdk.ServiceClient, qType string, initialURL string,
    24  	opts *QueryOpts) (interface{}, error) {
    25  
    26  	var queryPage Pager
    27  	switch qType {
    28  	case Marker:
    29  		pageBuilder := func(r PageResult) Page {
    30  			p := MarkerPageBase{PageResult: r}
    31  			if opts != nil && opts.MarkerField != "" {
    32  				p.setMarkerField(opts.MarkerField)
    33  			}
    34  			p.Owner = p
    35  			return p
    36  		}
    37  
    38  		queryPage = NewPager(client, initialURL, pageBuilder)
    39  	case Offset:
    40  		pageBuilder := func(r PageResult) Page {
    41  			return OffsetPageBase{PageResult: r}
    42  		}
    43  
    44  		queryPage = NewPager(client, initialURL, pageBuilder)
    45  	case PageSize:
    46  		pageBuilder := func(r PageResult) Page {
    47  			return PageSizeBase{PageResult: r}
    48  		}
    49  
    50  		queryPage = NewPager(client, initialURL, pageBuilder)
    51  	default:
    52  		err := golangsdk.ErrUnexpectedType{}
    53  		err.Expected = fmt.Sprintf("%s/%s/%s", Marker, Offset, PageSize)
    54  		err.Actual = qType
    55  		return nil, err
    56  	}
    57  
    58  	queryPage.Headers = map[string]string{"Content-Type": "application/json;charset=utf8"}
    59  	pages, err := queryPage.AllPages()
    60  	if err != nil {
    61  		return nil, err
    62  	}
    63  	return pages.GetBody(), nil
    64  }