terraform/vendor/github.com/henrikhodne/go-librato/librato/pagination.go

71 lines
1.7 KiB
Go
Raw Normal View History

2016-08-12 18:57:48 +02:00
package librato
import (
"fmt"
"net/url"
)
// PaginationResponseMeta contains pagination metadata from Librato API
// responses.
type PaginationResponseMeta struct {
Offset uint `json:"offset"`
Length uint `json:"length"`
Total uint `json:"total"`
Found uint `json:"found"`
}
// Calculate the pagination metadata for the next page of the result set.
// Takes the metadata used to request the current page so that it can use the
// same sort/orderby options
func (p *PaginationResponseMeta) nextPage(originalQuery *PaginationMeta) (next *PaginationMeta) {
nextOffset := p.Offset + p.Length
if nextOffset >= p.Found {
return nil
}
next = &PaginationMeta{}
next.Offset = nextOffset
next.Length = p.Length
if originalQuery != nil {
next.OrderBy = originalQuery.OrderBy
next.Sort = originalQuery.Sort
}
return next
}
// PaginationMeta contains metadata that the Librato API requires for pagination
// http://dev.librato.com/v1/pagination
type PaginationMeta struct {
Offset uint `url:"offset,omitempty"`
Length uint `url:"length,omitempty"`
OrderBy string `url:"orderby,omitempty"`
Sort string `url:"sort,omitempty"`
}
// EncodeValues is implemented to allow other strucs to embed PaginationMeta and
// still use github.com/google/go-querystring/query to encode the struct. It
// makes PaginationMeta implement query.Encoder.
func (m *PaginationMeta) EncodeValues(name string, values *url.Values) error {
if m == nil {
return nil
}
if m.Offset != 0 {
values.Set("offset", fmt.Sprintf("%d", m.Offset))
}
if m.Length != 0 {
values.Set("length", fmt.Sprintf("%d", m.Length))
}
if m.OrderBy != "" {
values.Set("orderby", m.OrderBy)
}
if m.Sort != "" {
values.Set("sort", m.Sort)
}
return nil
}