packages/pagination/pagination.go (173 lines of code) (raw):
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
package pagination
import (
"net/http"
"reflect"
"github.com/openai/openai-go/internal/apijson"
"github.com/openai/openai-go/internal/requestconfig"
"github.com/openai/openai-go/option"
"github.com/openai/openai-go/packages/param"
"github.com/openai/openai-go/packages/resp"
)
// aliased to make [param.APIUnion] private when embedding
type paramUnion = param.APIUnion
// aliased to make [param.APIObject] private when embedding
type paramObj = param.APIObject
type Page[T any] struct {
Data []T `json:"data"`
Object string `json:"object,required"`
// Metadata for the response, check the presence of optional fields with the
// [resp.Field.IsPresent] method.
JSON struct {
Data resp.Field
Object resp.Field
ExtraFields map[string]resp.Field
raw string
} `json:"-"`
cfg *requestconfig.RequestConfig
res *http.Response
}
// Returns the unmodified JSON received from the API
func (r Page[T]) RawJSON() string { return r.JSON.raw }
func (r *Page[T]) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
// GetNextPage returns the next page as defined by this pagination style. When
// there is no next page, this function will return a 'nil' for the page value, but
// will not return an error
func (r *Page[T]) GetNextPage() (res *Page[T], err error) {
// This page represents a response that isn't actually paginated at the API level
// so there will never be a next page.
cfg := (*requestconfig.RequestConfig)(nil)
if cfg == nil {
return nil, nil
}
var raw *http.Response
cfg.ResponseInto = &raw
cfg.ResponseBodyInto = &res
err = cfg.Execute()
if err != nil {
return nil, err
}
res.SetPageConfig(cfg, raw)
return res, nil
}
func (r *Page[T]) SetPageConfig(cfg *requestconfig.RequestConfig, res *http.Response) {
if r == nil {
r = &Page[T]{}
}
r.cfg = cfg
r.res = res
}
type PageAutoPager[T any] struct {
page *Page[T]
cur T
idx int
run int
err error
paramObj
}
func NewPageAutoPager[T any](page *Page[T], err error) *PageAutoPager[T] {
return &PageAutoPager[T]{
page: page,
err: err,
}
}
func (r *PageAutoPager[T]) Next() bool {
if r.page == nil || len(r.page.Data) == 0 {
return false
}
if r.idx >= len(r.page.Data) {
r.idx = 0
r.page, r.err = r.page.GetNextPage()
if r.err != nil || r.page == nil || len(r.page.Data) == 0 {
return false
}
}
r.cur = r.page.Data[r.idx]
r.run += 1
r.idx += 1
return true
}
func (r *PageAutoPager[T]) Current() T {
return r.cur
}
func (r *PageAutoPager[T]) Err() error {
return r.err
}
func (r *PageAutoPager[T]) Index() int {
return r.run
}
type CursorPage[T any] struct {
Data []T `json:"data"`
HasMore bool `json:"has_more"`
// Metadata for the response, check the presence of optional fields with the
// [resp.Field.IsPresent] method.
JSON struct {
Data resp.Field
HasMore resp.Field
ExtraFields map[string]resp.Field
raw string
} `json:"-"`
cfg *requestconfig.RequestConfig
res *http.Response
}
// Returns the unmodified JSON received from the API
func (r CursorPage[T]) RawJSON() string { return r.JSON.raw }
func (r *CursorPage[T]) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
// GetNextPage returns the next page as defined by this pagination style. When
// there is no next page, this function will return a 'nil' for the page value, but
// will not return an error
func (r *CursorPage[T]) GetNextPage() (res *CursorPage[T], err error) {
if r.JSON.HasMore.IsPresent() && r.HasMore == false {
return nil, nil
}
items := r.Data
if items == nil || len(items) == 0 {
return nil, nil
}
cfg := r.cfg.Clone(r.cfg.Context)
value := reflect.ValueOf(items[len(items)-1])
field := value.FieldByName("ID")
cfg.Apply(option.WithQuery("after", field.Interface().(string)))
var raw *http.Response
cfg.ResponseInto = &raw
cfg.ResponseBodyInto = &res
err = cfg.Execute()
if err != nil {
return nil, err
}
res.SetPageConfig(cfg, raw)
return res, nil
}
func (r *CursorPage[T]) SetPageConfig(cfg *requestconfig.RequestConfig, res *http.Response) {
if r == nil {
r = &CursorPage[T]{}
}
r.cfg = cfg
r.res = res
}
type CursorPageAutoPager[T any] struct {
page *CursorPage[T]
cur T
idx int
run int
err error
paramObj
}
func NewCursorPageAutoPager[T any](page *CursorPage[T], err error) *CursorPageAutoPager[T] {
return &CursorPageAutoPager[T]{
page: page,
err: err,
}
}
func (r *CursorPageAutoPager[T]) Next() bool {
if r.page == nil || len(r.page.Data) == 0 {
return false
}
if r.idx >= len(r.page.Data) {
r.idx = 0
r.page, r.err = r.page.GetNextPage()
if r.err != nil || r.page == nil || len(r.page.Data) == 0 {
return false
}
}
r.cur = r.page.Data[r.idx]
r.run += 1
r.idx += 1
return true
}
func (r *CursorPageAutoPager[T]) Current() T {
return r.cur
}
func (r *CursorPageAutoPager[T]) Err() error {
return r.err
}
func (r *CursorPageAutoPager[T]) Index() int {
return r.run
}