lib/horizon/request_params.ex

defmodule Stellar.Horizon.RequestParams do
  @moduledoc """
  Returns a Keyword list of formatted params
  """

  @type args :: Keyword.t()
  @type type :: atom()

  @spec build_assets_params(args :: args(), type :: type()) :: Keyword.t()
  def build_assets_params(args, type)
      when type in ~w(selling_asset buying_asset destination_asset source_asset base_asset counter_asset)a do
    args
    |> Keyword.get(type)
    |> resolve_asset_params(type)
  end

  def build_assets_params(_args, _type), do: []

  @spec resolve_asset_params(args :: args(), type :: type()) :: Keyword.t()
  defp resolve_asset_params([code: code, issuer: issuer], type) do
    [
      "#{type}_type": resolve_asset_type(code),
      "#{type}_code": code,
      "#{type}_issuer": issuer
    ]
  end

  defp resolve_asset_params(:native, type), do: ["#{type}_type": :native]
  defp resolve_asset_params(_args, _type), do: []

  @spec resolve_asset_type(code :: String.t()) :: atom()
  defp resolve_asset_type(code) when byte_size(code) < 5, do: :credit_alphanum4
  defp resolve_asset_type(_code), do: :credit_alphanum12
end