Sha256: 13ee55f5cdc14135eea9c5dc264f48290f6bf7bf845ad1fa676e4a645972123b

Contents?: true

Size: 1.99 KB

Versions: 3

Compression:

Stored size: 1.99 KB

Contents

module GraphitiErrors
  class ExceptionHandler
    attr_accessor :show_raw_error

    def initialize(options = {})
      @status  = options[:status]
      @title   = options[:title]
      @message = options[:message]
      @meta    = options[:meta]
      @log     = options[:log]
    end

    def status_code(error)
      @status || 500
    end

    def error_code(error)
      status_code = status_code(error)
      Rack::Utils::SYMBOL_TO_STATUS_CODE.invert[status_code]
    end

    def backtrace_cleaner
      defined?(Rails) ? Rails.backtrace_cleaner : nil
    end

    def title
      @title || "Error"
    end

    def detail(error)
      if @message == true
        error.message
      else
        @message ? @message.call(error) : default_detail
      end
    end

    def meta(error)
      {}.tap do |meta_payload|
        if @meta.respond_to?(:call)
          meta_payload.merge!(@meta.call(error))
        end

        if show_raw_error
          meta_payload[:__raw_error__] = {
            message: error.message,
            debug: error.instance_variable_get(:@__graphiti_debug),
            backtrace: error.backtrace,
          }
        end
      end
    end

    def error_payload(error)
      {
        errors: [
          code: error_code(error),
          status: status_code(error).to_s,
          title: title,
          detail: detail(error),
          meta: meta(error),
        ],
      }
    end

    def log?
      @log != false
    end

    def log(error)
      return unless log?
      backtrace = error.backtrace

      if (cleaner = backtrace_cleaner)
        backtrace = cleaner.clean(backtrace)
      end

      log_error(error, backtrace)
    end

    private

    def log_error(e, backtrace)
      logger.error "\033[31mERROR: #{e.class}: #{e.message}\033[0m"
      logger.error "\033[31m#{backtrace.join("\n")}\033[0m"
    end

    def logger
      GraphitiErrors.logger
    end

    def default_detail
      "We've notified our engineers and hope to address this issue shortly."
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
graphiti_errors-1.1.2 lib/graphiti_errors/exception_handler.rb
graphiti_errors-1.1.1 lib/graphiti_errors/exception_handler.rb
graphiti_errors-1.1.0 lib/graphiti_errors/exception_handler.rb