Extract LastFm.API.ErrorResponse

This commit is contained in:
Claudio Ortolina
2025-05-07 08:24:47 +01:00
parent 83d13da679
commit c7491719e3
2 changed files with 51 additions and 52 deletions
+1 -52
View File
@@ -1,58 +1,7 @@
defmodule LastFm.API do
require Logger
alias LastFm.{Artist, Session, Track}
defmodule 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
alias LastFm.{API.ErrorResponse, Artist, Session, Track}
def get_session(token, config) do
# Note that params needs to be ordered alphabetically
+50
View File
@@ -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