lib/opus/pipeline_error.ex

defmodule Opus.PipelineError do
  @moduledoc ~S"""
  Error struct capturing useful information to detect where an error was caused and why.
  """

  @type t :: %__MODULE__{
          error: any,
          input: any,
          pipeline: module,
          stage: atom,
          stacktrace: [{module, atom, non_neg_integer, keyword}]
        }

  defexception [:error, :pipeline, :stage, :input, :stacktrace]

  def message(%{error: error, pipeline: pipeline, stage: stage, input: input, stacktrace: trace}) do
    "Pipeline #{inspect(pipeline)} failed at stage #{stage} with error: #{inspect(error)}, input #{
      inspect(input)
    }, stacktrace: #{inspect(trace)}"
  end
end