Class: Talkbird::Result::PaginatedSuccess

Inherits:
Object
  • Object
show all
Defined in:
lib/talkbird/result/paginated_success.rb

Overview

A variation of the result which should support composition.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(result) ⇒ PaginatedSuccess

Returns a new instance of PaginatedSuccess.



22
23
24
# File 'lib/talkbird/result/paginated_success.rb', line 22

def initialize(result)
  @result = result
end

Class Method Details

.deep_merge(data, elem) ⇒ Object



10
11
12
13
14
15
16
17
18
# File 'lib/talkbird/result/paginated_success.rb', line 10

def deep_merge(data, elem)
  data.merge(elem) do |key, oldval, newval|
    if key == :next
      nil
    else
      oldval + newval
    end
  end
end

Instance Method Details

#composeObject



38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/talkbird/result/paginated_success.rb', line 38

def compose
  body = MultiJson.load(@result.body.to_s, symbolize_keys: true)
  token = body[:next].to_s

  if !token.empty?
    [
      Result::Success.new(@result, body),
      next_page(token)
    ].flatten
  else
    [Result::Success.new(@result, body)]
  end
end

#next_page(token) ⇒ Object



52
53
54
55
56
57
58
# File 'lib/talkbird/result/paginated_success.rb', line 52

def next_page(token)
  Talkbird::Client.request(
    :get,
    @result.uri,
    params: { token: token, limit: 100 }
  )
end

#reduceObject



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/talkbird/result/paginated_success.rb', line 26

def reduce
  body = compose.reduce({}) { |data, el| PaginatedSuccess.deep_merge(data, el.body) }
  response = HTTP::Response.new(
    status: @result.status,
    version: @result.version,
    body: MultiJson.dump(body),
    headers: @result.headers
  )

  Result::Success.new(response, body)
end