lib/ledger_entry.ex

defmodule XRPL.LedgerEntry do
  @moduledoc """
  The ledger_entry method returns a single ledger entry from the XRP Ledger in its raw format.
  See [ledger format](https://xrpl.org/ledger-object-types.html) for information on the different types of entries you can retrieve.

  Official documentation: https://xrpl.org/ledger_entry.html
  """

  import XRPL

  @doc """
  Retrieve any type of ledger object by its unique ID.

  Official documentation: https://xrpl.org/ledger_entry.html#get-ledger-object-by-id
  """
  # @spec by_id(integer | String.t(), String.t()) :: Tesla.Env.result()
  def by_id(ledger_index, index) when is_ledger_index(index) do
    post("/", %{
      method: "ledger_entry",
      params: [%{ledger_index: ledger_index, index: index}]
    })
  end

  def by_id!(ledger_index, index), do: unwrap_or_raise(by_id(ledger_index, index))

  @spec account_root(integer | String.t(), Keyword.t()) :: Tesla.Env.result()
  def account_root(account_root, ledger_index) do
    post("/", %{
      method: "ledger_entry",
      params: [
        %{
          account_root: account_root,
          ledger_index: ledger_index
        }
      ]
    })
  end

  def ledger_entry(:amm, ledger_index, asset) when is_binary(asset) do
    post("/", %{
      method: "ledger_entry",
      params: [
        %{
          amm: %{asset: asset},
          ledger_index: ledger_index
        }
      ]
    })
  end

  def ledger_entry(:amm, ledger_index, %{asset: asset, asset2: asset2}) do
    post("/", %{
      method: "ledger_entry",
      amm: %{
        asset: asset,
        asset2: asset2
      },
      ledger_index: ledger_index
    })
  end

  def ledger_entry(:directory_node, ledger_index, directory) when is_binary(directory) do
    post("/", %{
      method: "ledger_entry",
      params: [%{directory: directory, ledger_index: ledger_index}]
    })
  end

  def ledger_entry(:directory_node, ledger_index, opts) do
    opts =
      Keyword.filter(opts, &Enum.any?([:subindex, :dir_root, :owner], &1))

    post("/", %{
      method: "ledger_entry",
      params: [%{ledger_index: ledger_index, directory: Map.new(opts)}]
    })
  end

  def ledger_entry(:offer, ledger_index, offer) when is_binary(offer) do
    post("/", %{
      method: "ledger_entry",
      params: [%{offer: offer, ledger_index: ledger_index}]
    })
  end

  def ledger_entry(:offer, ledger_index, account, seq) do
    post("/", %{
      method: "ledger_entry",
      params: [%{offer: %{account: account, seq: seq}, ledger_index: ledger_index}]
    })
  end

  # def ledger_entry(:ripple_state, ledger_index, accounts, currency) do
  # end
end