require "twitter/enumerable" require "twitter/rest/request" require "twitter/utils" module Twitter class Cursor include Twitter::Enumerable include Twitter::Utils # @return [Hash] attr_reader :attrs alias to_h attrs alias to_hash to_h # Initializes a new Cursor # # @param key [String, Symbol] The key to fetch the data from the response # @param klass [Class] The class to instantiate objects in the response # @param request [Twitter::REST::Request] # @param limit [Integer] After reaching the limit, we stop fetching next page # @return [Twitter::Cursor] def initialize(key, klass, request, limit = nil) @key = key.to_sym @klass = klass @client = request.client @request_method = request.verb @path = request.path @options = request.options @collection = [] @limit = limit self.attrs = request.perform end private # @return [Integer] def next_cursor @attrs[:next_cursor] end alias next next_cursor # @return [Boolean] def last? return false if next_cursor.is_a?(String) return true if next_cursor.nil? next_cursor.zero? end # @return [Boolean] def reached_limit? @limit && @limit <= attrs[@key].count end # @return [Hash] def fetch_next_page response = Twitter::REST::Request.new(@client, @request_method, @path, @options.merge(cursor: next_cursor)).perform self.attrs = response end # @param attrs [Hash] # @return [Hash] def attrs=(attrs) @attrs = attrs @attrs.fetch(@key, []).each do |element| @collection << (@klass ? @klass.new(element) : element) end @attrs end end end