224 lines
5.1 KiB
Go
224 lines
5.1 KiB
Go
// 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/respjson"
|
|
)
|
|
|
|
// 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"`
|
|
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
|
|
JSON struct {
|
|
Data respjson.Field
|
|
Object respjson.Field
|
|
ExtraFields map[string]respjson.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) {
|
|
if len(r.Data) == 0 {
|
|
return nil, nil
|
|
}
|
|
// 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"`
|
|
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
|
|
JSON struct {
|
|
Data respjson.Field
|
|
HasMore respjson.Field
|
|
ExtraFields map[string]respjson.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 len(r.Data) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
if r.JSON.HasMore.Valid() && 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")
|
|
err = cfg.Apply(option.WithQuery("after", field.Interface().(string)))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
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
|
|
}
|