Extract LastFm.API.ErrorResponse
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
defmodule LastFm.API.ErrorResponse do
|
||||
defstruct [:error, :message]
|
||||
|
||||
def new(error_code, message) do
|
||||
%__MODULE__{error: map_error(error_code), message: message}
|
||||
end
|
||||
|
||||
defp map_error(2), do: :invalid_service
|
||||
defp map_error(3), do: :invalid_method
|
||||
defp map_error(4), do: :authentication_failed
|
||||
defp map_error(5), do: :invalid_format
|
||||
defp map_error(6), do: :invalid_parameters
|
||||
defp map_error(7), do: :invalid_resource
|
||||
defp map_error(8), do: :operation_failed
|
||||
defp map_error(9), do: :invalid_session_key
|
||||
defp map_error(10), do: :invalid_api_key
|
||||
defp map_error(11), do: :service_offline
|
||||
defp map_error(13), do: :invalid_method_signature
|
||||
defp map_error(16), do: :transient_error
|
||||
defp map_error(26), do: :suspended_api_key
|
||||
defp map_error(29), do: :rate_limit_exceeded
|
||||
|
||||
@doc """
|
||||
Returns true if the error is retryable, false otherwise.
|
||||
"""
|
||||
def retryable_error?(error)
|
||||
when error in [
|
||||
:transient_error,
|
||||
:service_offline,
|
||||
:rate_limit_exceeded,
|
||||
:operation_failed
|
||||
],
|
||||
do: true
|
||||
|
||||
def retryable_error?(_error), do: false
|
||||
|
||||
@doc """
|
||||
Returns the recommended retry delay in milliseconds for retryable errors.
|
||||
Returns nil for non-retryable errors.
|
||||
"""
|
||||
# 1 minute
|
||||
def retry_delay(:rate_limit_exceeded), do: 60_000
|
||||
# 30 seconds
|
||||
def retry_delay(:service_offline), do: 30_000
|
||||
# 5 seconds
|
||||
def retry_delay(:transient_error), do: 5_000
|
||||
# 5 seconds
|
||||
def retry_delay(:operation_failed), do: 5_000
|
||||
def retry_delay(_), do: nil
|
||||
end
|
||||
Reference in New Issue
Block a user