lib/anthropic/internal/page.rb (63 lines of code) (raw):

# frozen_string_literal: true module Anthropic module Internal # @generic Elem # # @example # if page.has_next? # page = page.next_page # end # # @example # page.auto_paging_each do |batch| # puts(batch) # end class Page include Anthropic::Internal::Type::BasePage # @return [Array<generic<Elem>>, nil] attr_accessor :data # @return [Boolean] attr_accessor :has_more # @return [String, nil] attr_accessor :first_id # @return [String, nil] attr_accessor :last_id # @api private # # @param client [Anthropic::Internal::Transport::BaseClient] # @param req [Hash{Symbol=>Object}] # @param headers [Hash{String=>String}, Net::HTTPHeader] # @param page_data [Hash{Symbol=>Object}] def initialize(client:, req:, headers:, page_data:) super model = req.fetch(:model) case page_data in {data: Array | nil => data} @data = data&.map { Anthropic::Internal::Type::Converter.coerce(model, _1) } else end case page_data in {has_more: true | false | nil => has_more} @has_more = has_more else end case page_data in {first_id: String | nil => first_id} @first_id = first_id else end case page_data in {last_id: String | nil => last_id} @last_id = last_id else end end # @return [Boolean] def next_page? has_more end # @raise [Anthropic::HTTP::Error] # @return [Anthropic::Internal::Page] def next_page unless next_page? message = "No more pages available. Please check #next_page? before calling ##{__method__}" raise RuntimeError.new(message) end req = Anthropic::Internal::Util.deep_merge( @req, {query: first_id.nil? ? {after_id: last_id} : {before_id: first_id}} ) @client.request(req) end # @param blk [Proc] # # @yieldparam [generic<Elem>] def auto_paging_each(&blk) unless block_given? raise ArgumentError.new("A block must be given to ##{__method__}") end page = self loop do page.data&.each { blk.call(_1) } break unless page.next_page? page = page.next_page end end # @return [String] def inspect # rubocop:disable Layout/LineLength "#<#{self.class}:0x#{object_id.to_s(16)} data=#{data.inspect} has_more=#{has_more.inspect} first_id=#{first_id.inspect} last_id=#{last_id.inspect}>" # rubocop:enable Layout/LineLength end end end end