# frozen_string_literal: true
module Gitlab
# Wrapper class of paginated response.
class PaginatedResponse
attr_accessor :client
def initialize(array)
@array = array
end
def ==(other)
@array == other
end
def inspect
@array.inspect
end
def method_missing(name, *args, &block)
if @array.respond_to?(name)
@array.send(name, *args, &block)
else
super
end
end
def respond_to_missing?(method_name, include_private = false)
super || @array.respond_to?(method_name, include_private)
end
def parse_headers!(headers)
@links = PageLinks.new headers
end
def each_page
current = self
yield current
while current.has_next_page?
current = current.next_page
yield current
end
end
def lazy_paginate
to_enum(:each_page).lazy.flat_map(&:to_ary) # rubocop:disable Lint/ToEnumArguments
end
def auto_paginate(&block)
return lazy_paginate.to_a unless block
lazy_paginate.each(&block)
end
def paginate_with_limit(limit, &block)
return lazy_paginate.take(limit).to_a unless block
lazy_paginate.take(limit).each(&block)
end
def last_page?
!(@links.nil? || @links.last.nil?)
end
alias has_last_page? last_page?
def last_page
return nil if @client.nil? || !has_last_page?
@client.get(client_relative_path(@links.last))
end
def first_page?
!(@links.nil? || @links.first.nil?)
end
alias has_first_page? first_page?
def first_page
return nil if @client.nil? || !has_first_page?
@client.get(client_relative_path(@links.first))
end
def next_page?
!(@links.nil? || @links.next.nil?)
end
alias has_next_page? next_page?
def next_page
return nil if @client.nil? || !has_next_page?
@client.get(client_relative_path(@links.next))
end
def prev_page?
!(@links.nil? || @links.prev.nil?)
end
alias has_prev_page? prev_page?
def prev_page
return nil if @client.nil? || !has_prev_page?
@client.get(client_relative_path(@links.prev))
end
def client_relative_path(link)
client_endpoint_path = URI.parse(@client.endpoint).request_uri # api/v4
URI.parse(link).request_uri.sub(client_endpoint_path, '')
end
end
end