lib/horizon/effects.ex

defmodule Stellar.Horizon.Effects do
  @moduledoc """
  Exposes functions to interact with Effects in Horizon.

  You can:
  * List all effects.

  Horizon API reference: https://developers.stellar.org/api/resources/effects/
  """

  alias Stellar.Horizon.{Collection, Effect, Error, Request, Server}

  @type server :: Server.t()
  @type options :: Keyword.t()
  @type resource :: Effect.t() | Collection.t()
  @type response :: {:ok, resource()} | {:error, Error.t()}

  @endpoint "effects"

  @doc """
  Lists all effects.

  ## Parameters
    * `server`: The Horizon server to query.

  ## Options

    * `cursor`: A number that points to a specific location in a collection of responses and is pulled from the `paging_token` value of a record.
    * `order`: A designation of the order in which records should appear. Options include `asc` (ascending) or `desc` (descending).
    * `limit`: The maximum number of records returned. The limit can range from 1 to 200. Defaults to 10.

  ## Examples

      iex> Effects.all(Stellar.Horizon.Server.testnet(), limit: 10, order: :asc)
      {:ok, %Collection{records: [%Effect{}, ...]}}
  """
  @spec all(server :: server(), options :: options()) :: response()
  def all(server, options \\ []) do
    server
    |> Request.new(:get, @endpoint)
    |> Request.add_query(options)
    |> Request.perform()
    |> Request.results(collection: {Effect, &all(server, &1)})
  end
end