Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
elixir_pay-errors / lib / elixir_pay / errors.rb
Size: Mime:
require 'nanoid'
require 'elixir_pay/errors/version'
require 'elixir_pay/errors/api_error'
require 'elixir_pay/errors/handler'
require 'elixir_pay/errors/renderer'

module ElixirPay
  # Error Code And Handler
  module Errors
    include Handler
    include Renderer

    def self.included(action)
      action.class_eval do
        handle_exception StandardError => :app_exception
        handle_exception ScriptError => :app_exception
        handle_exception SecurityError => :app_exception
        handle_exception NoMemoryError => :app_exception
      end
    end

    def app_exception(exception)
      error = if exception.is_a? ElixirPay::Errors::ApiError
                format_error(exception)
              else
                format_standard_error(exception)
              end

      if respond_to?(:handle_exception)
        send(:handle_exception, exception) if respond_to?(:handle_exception)
      else
        logger_warn(exception)

        Hanami.logger.error error, class_name: self.class.name
      end

      api_errors(exception)
    rescue StandardError => e
      if respond_to?(:handle_exception)
        send(:handle_exception, exception) if respond_to?(:handle_exception)
      else
        Hanami.logger.error format_standard_error(e)
      end
    end

    def logger_warn(exception)
      return unless exception.is_a? ElixirPay::Errors::ApiError

      return if exception.error.nil?

      Hanami.logger.warn exception.error.message
    end

    def format_error(exception)
      message = {
        title: "[#{Paint[exception&.title || exception.class.name, :blue]}]",
        code: "[#{Paint[exception&.code || 500, :yellow]}]",
        message: "[#{Paint[exception.message, :red]}]"
      }

      "#{message.map { |_, v| v }.join(' ')}\n#{exception.backtrace.join("\n")}"
    end

    def format_standard_error(exception)
      message = {
        title: "[#{Paint[exception.class.name, :blue]}]",
        code: 500,
        message: "[#{Paint[exception.message, :red]}]"
      }

      "#{message.map { |_, v| v }.join(' ')}\n#{exception.backtrace.join("\n")}"
    end
  end
end