Packages
stellar_sdk
0.11.3
0.23.0
0.22.0
0.21.2
0.21.1
0.21.0
0.20.0
0.19.0
0.18.1
0.18.0
0.17.1
0.17.0
0.16.1
0.16.0
0.15.1
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Elixir SDK for the Stellar network.
Current section
Files
Jump to
Current section
Files
lib/horizon/collection.ex
defmodule Stellar.Horizon.Collection do
@moduledoc """
Paginates data and returns collection-based results for multiple Horizon endpoints.
"""
alias Stellar.Horizon.CollectionError
@type resource :: {module(), function()}
@type records :: [resource(), ...]
@type response :: map()
@type pagination :: {function(), Keyword.t()}
@type t :: %__MODULE__{records: records(), prev: function(), next: function()}
defstruct [:records, :next, :prev]
@spec new(response :: response(), resource :: resource()) :: t()
def new(
%{
_embedded: %{records: records},
_links: %{prev: %{href: prev_url}, next: %{href: next_url}}
},
{resource, paginate_fun}
) do
%__MODULE__{
records: Enum.map(records, &resource.new/1),
prev: paginate({paginate_fun, prev_url}),
next: paginate({paginate_fun, next_url})
}
end
def new(_response, _resource), do: raise(CollectionError, :invalid_collection)
@spec paginate(pagination :: pagination()) :: function()
defp paginate({paginate_fn, url}) do
fn ->
url
|> pagination_query()
|> paginate_fn.()
end
end
@spec pagination_query(url :: String.t()) :: Keyword.t()
defp pagination_query(url) do
case URI.parse(url) do
%URI{query: query} when not is_nil(query) ->
query
|> URI.query_decoder()
|> Enum.map(fn {key, value} -> {String.to_atom(key), value} end)
_uri ->
[]
end
end
end