lib/middleware/error.ex

defmodule XRPL.Middleware.Error do
  @moduledoc """
  Makes requests that don't respond to HTTP Success codes to return as a error


  ### Example usage
  ```
  defmodule MyClient do
    use Tesla

    plug(XRPL.Middleware.Error)
  end
  ```
  """

  @behaviour Tesla.Middleware

  def call(env, next, _options) do
    env
    |> Tesla.run(next)
    |> check_status()
    |> check_body()
  end

  def check_status({:ok, env}) do
    case env.status do
      s when s in [200, 201, 202, 203, 204] ->
        {:ok, env}

      _ ->
        {:error, env}
    end
  end

  def check_body({:error, error}), do: {:error, error}

  def check_body({:ok, env}) do
    if Map.has_key?(env.body["result"], "error") do
      {:error, env}
    else
      {:ok, env}
    end
  end
end