package pagination import ( "fmt" "reflect" "github.com/gophercloud/gophercloud" ) // MarkerPage is a stricter Page interface that describes additional functionality required for use with NewMarkerPager. // For convenience, embed the MarkedPageBase struct. type MarkerPage interface { Page // LastMarker returns the last "marker" value on this page. LastMarker() (string, error) } // MarkerPageBase is a page in a collection that's paginated by "limit" and "marker" query parameters. type MarkerPageBase struct { PageResult // Owner is a reference to the embedding struct. Owner MarkerPage } // NextPageURL generates the URL for the page of results after this one. func (current MarkerPageBase) NextPageURL() (string, error) { currentURL := current.URL mark, err := current.Owner.LastMarker() if err != nil { return "", err } q := currentURL.Query() q.Set("marker", mark) currentURL.RawQuery = q.Encode() return currentURL.String(), nil } // IsEmpty satisifies the IsEmpty method of the Page interface func (current MarkerPageBase) IsEmpty() (bool, error) { if b, ok := current.Body.([]interface{}); ok { return len(b) == 0, nil } err := gophercloud.ErrUnexpectedType{} err.Expected = "[]interface{}" err.Actual = fmt.Sprintf("%v", reflect.TypeOf(current.Body)) return true, err } // GetBody returns the linked page's body. This method is needed to satisfy the // Page interface. func (current MarkerPageBase) GetBody() interface{} { return current.Body }