defmodule Stellar.Horizon.Error do @moduledoc """ Represents an error which occurred during a Horizon API call. """ @type type :: String.t() | nil @type title :: String.t() | nil @type status_code :: 200 | 400 | 404 | 406 | 422 | 500 | :network_error @type detail :: String.t() | nil @type base64_xdr :: String.t() @type result_code :: String.t() @type result_codes :: %{ optional(:transaction) => result_code(), optional(:operations) => list(result_code()) } @type extras :: %{ optional(:envelope_xdr) => base64_xdr(), optional(:result_codes) => result_codes(), optional(:result_xdr) => base64_xdr() } @type error_source :: :horizon | :network @type error_body :: map() | atom() | String.t() @type error :: {error_source(), error_body()} @type t :: %__MODULE__{ type: type(), title: title(), status_code: status_code(), detail: detail(), extras: extras() } defstruct [:type, :title, :status_code, :detail, extras: %{}] @spec new(error :: error()) :: t() def new({:horizon, %{type: type, title: title, status: status_code, detail: detail} = error}) do %__MODULE__{ type: type, title: title, status_code: status_code, detail: detail, extras: error[:extras] } end def new({:network, error}) do %__MODULE__{ title: "Network error", status_code: :network_error, detail: "An error occurred while making the network request: #{inspect(error)}" } end end