Sha256: 0ded84b0035ca3ff027c6353486a73c386bd7aa6c5e6fe0c6cc881e991bd40cd

Contents?: true

Size: 1.92 KB

Versions: 3

Compression:

Stored size: 1.92 KB

Contents

# frozen_string_literal: true

module SkinbaronApiClient
  # Mixin for adding error handling capabilities to API client classes.
  # Provides methods for response validation and error logging.
  module ErrorHandling
    def self.included(base)
      base.extend(ClassMethods)
    end

    # Class methods for decorating instance methods with error handling.
    # Provides the with_error_handling decorator for wrapping methods.
    module ClassMethods
      def with_error_handling(method_name)
        original_method = instance_method(method_name)

        define_method(method_name) do |*args, **kwargs|
          response = original_method.bind(self).call(*args, **kwargs)

          check_response_success(response)
          check_response_authentication(response)

          response
        rescue HTTP::Error => e
          log_error(message: "HTTP request failed", error: e)
          raise RequestError, "HTTP request failed: #{e.message}"
        rescue JSON::ParserError => e
          log_error(message: "JSON parsing failed", error: e)
          raise ResponseError, "Invalid JSON response: #{e.message}"
        end
      end
    end

    private

    def logger
      SkinbaronApiClient::Logger.instance
    end

    def log_error(message:, error:)
      logger.error(
        message,
        {
          error_class: error.class.name,
          error_message: error.message,
          backtrace: error.backtrace&.first(5)
        }
      )
    end

    def check_response_success(response)
      return if response[:status]&.success?

      raise ResponseError, "Request failed with status #{response[:status]}. Response: #{response[:body]}"
    end

    def check_response_authentication(response)
      return unless response[:body].to_s.include? "wrong or unauthenticated request"

      logger.error("Authentication failed", { body: response[:body] })
      raise AuthenticationError, "Authentication failed: #{response[:body]}"
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
skinbaron_api_client-0.2.1 lib/skinbaron_api_client/error_handling.rb
skinbaron_api_client-0.2.0 lib/skinbaron_api_client/error_handling.rb
skinbaron_api_client-0.1.0 lib/skinbaron_api_client/error_handling.rb