From c7491719e369a98831a75e56b21fbe792a4cb40d Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Wed, 7 May 2025 08:24:47 +0100 Subject: [PATCH] Extract LastFm.API.ErrorResponse --- lib/last_fm/api.ex | 53 +------------------------------ lib/last_fm/api/error_response.ex | 50 +++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 52 deletions(-) create mode 100644 lib/last_fm/api/error_response.ex diff --git a/lib/last_fm/api.ex b/lib/last_fm/api.ex index 95ee68ba..65986fe6 100644 --- a/lib/last_fm/api.ex +++ b/lib/last_fm/api.ex @@ -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 diff --git a/lib/last_fm/api/error_response.ex b/lib/last_fm/api/error_response.ex new file mode 100644 index 00000000..08c34bcc --- /dev/null +++ b/lib/last_fm/api/error_response.ex @@ -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