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 }