lib/helpers.ex

defmodule NearApi.Helpers do
  @moduledoc """
  NEAR API Utils module;
  Note: Draft version, will be refactored
  """
  alias NearApi.RPC.Errors

  @doc """
  Does the actual RPC call to the NEAR API and formats output
  """
  def api_call(payload) do
    payload
    |> NearApi.HttpClient.api_call_method("query")
    |> process_api_response()
  end

  @doc """
  Does the actual RPC call to the NEAR API and formats output
  Usually used for experimental calls
  """
  def api_call_method(payload, method) do
    response = NearApi.HttpClient.api_call_method(payload, method)

    process_api_response(response)
  end

  @doc """
  Public Key retriever. :woof
  """
  def public_key do
    System.get_env("NEAR_PUBLIC_KEY")
  end

  # SOFT_ERROR - this is our error type when API weirdly returns you status_code: 200 but this is an error message
  defp process_api_response(response) do
    case response do
      %{"result" => %{"error" => error_message}} = response ->
        {:error, %{response: response, error_message: error_message, error_type: "SOFT_ERROR"}}

      %{"error" => _error} = response ->
        Errors.render_error(response)

      body ->
        {:ok, body}
    end
  end

  defmodule Monetary do
    @doc """
    Convert NEAR amount into Yocto amount
    """
    @spec near_to_yocto(near :: integer | float) :: integer
    def near_to_yocto(near) do
      (near * :math.pow(10, 24)) |> round
    end
  end
end