class RubyLLM::ErrorMiddleware

Uses provider’s parse_error method to extract meaningful error messages.
Faraday middleware that maps provider-specific API errors to RubyLLM errors.

def call(env)

def call(env)
  @app.call(env).on_complete do |response|
    self.class.parse_error(provider: @provider, response: response)
  end
end

def initialize(app, provider:)

def initialize(app, provider:)
  super(app)
  @provider = provider
end

def parse_error(provider:, response:) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/AbcSize,Metrics/PerceivedComplexity

rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/AbcSize,Metrics/PerceivedComplexity
def parse_error(provider:, response:) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/AbcSize,Metrics/PerceivedComplexity
  message = provider&.parse_error(response)
  case response.status
  when 200..399
    message
  when 400
    raise BadRequestError.new(response, message || 'Invalid request - please check your input')
  when 401
    raise UnauthorizedError.new(response, message || 'Invalid API key - check your credentials')
  when 402
    raise PaymentRequiredError.new(response, message || 'Payment required - please top up your account')
  when 403
    raise ForbiddenError.new(response,
                             message || 'Forbidden - you do not have permission to access this resource')
  when 429
    raise RateLimitError.new(response, message || 'Rate limit exceeded - please wait a moment')
  when 500
    raise ServerError.new(response, message || 'API server error - please try again')
  when 502..503
    raise ServiceUnavailableError.new(response, message || 'API server unavailable - please try again later')
  when 529
    raise OverloadedError.new(response, message || 'Service overloaded - please try again later')
  else
    raise Error.new(response, message || 'An unknown error occurred')
  end
end