lib/view_model/error_view.rb



# frozen_string_literal: true

require 'view_model/record'

# ViewModel for rendering ViewModel::AbstractErrors
class ViewModel::ErrorView < ViewModel::Record
  self.model_class = ViewModel::AbstractError
  self.view_name = 'Error'

  class ExceptionDetailView < ::ViewModel
    attributes :exception
    def serialize_view(json, serialize_context: nil)
      json.set! :class, exception.class.name
      json.backtrace exception.backtrace
      if (cause = exception.cause)
        json.cause do
          json.set! :class, cause.class.name
          json.backtrace cause.backtrace
        end
      end
    end
  end

  attributes :status, :detail, :title, :code, :meta
  attribute :causes, array: true, using: self
  attribute :exception, using: ExceptionDetailView

  # Ruby exceptions should never be serialized in production
  def serialize_exception(json, serialize_context:)
    if ViewModel::Config.show_cause_in_error_view
      super
    else
      json.exception nil
    end
  end
end