lib/curl_error_codes.ex

defmodule ExCurl.CurlErrorCodes do
  @moduledoc """
  Helper functions to map [curl error codes](https://curl.se/libcurl/c/libcurl-errors.html) from their integer value to the string value and vice versa.
  """

  @all_error_codes [
    "OK",
    "UNSUPPORTED_PROTOCOL",
    "FAILED_INIT",
    "URL_MALFORMAT",
    "NOT_BUILT_IN",
    "COULDNT_RESOLVE_PROXY",
    "COULDNT_RESOLVE_HOST",
    "COULDNT_CONNECT",
    "WEIRD_SERVER_REPLY",
    "REMOTE_ACCESS_DENIED",
    "FTP_ACCEPT_FAILED",
    "FTP_WEIRD_PASS_REPLY",
    "FTP_ACCEPT_TIMEOUT",
    "FTP_WEIRD_PASV_REPLY",
    "FTP_WEIRD_227_FORMAT",
    "FTP_CANT_GET_HOST",
    "HTTP2",
    "FTP_COULDNT_SET_TYPE",
    "PARTIAL_FILE",
    "FTP_COULDNT_RETR_FILE",
    "OBSOLETE (20)",
    "QUOTE_ERROR",
    "HTTP_RETURNED_ERROR",
    "WRITE_ERROR",
    "OBSOLETE (24)",
    "UPLOAD_FAILED",
    "READ_ERROR",
    "OUT_OF_MEMORY",
    "OPERATION_TIMEDOUT",
    "OBSOLETE (29)",
    "FTP_PORT_FAILED",
    "FTP_COULDNT_USE_REST",
    "OBSOLETE (32)",
    "RANGE_ERROR",
    "HTTP_POST_ERROR",
    "SSL_CONNECT_ERROR",
    "BAD_DOWNLOAD_RESUME",
    "FILE_COULDNT_READ_FILE",
    "LDAP_CANNOT_BIND",
    "LDAP_SEARCH_FAILED",
    "OBSOLETE (40)",
    "FUNCTION_NOT_FOUND",
    "ABORTED_BY_CALLBACK",
    "BAD_FUNCTION_ARGUMENT",
    "OBSOLETE (44)",
    "INTERFACE_FAILED",
    "OBSOLETE (46)",
    "TOO_MANY_REDIRECTS",
    "UNKNOWN_OPTION",
    "SETOPT_OPTION_SYNTAX",
    "OBSOLETE (50)",
    "OBSOLETE (51)",
    "GOT_NOTHING",
    "SSL_ENGINE_NOTFOUND",
    "SSL_ENGINE_SETFAILED",
    "SEND_ERROR",
    "RECV_ERROR",
    "OBSOLETE (57)",
    "SSL_CERTPROBLEM",
    "SSL_CIPHER",
    "PEER_FAILED_VERIFICATION",
    "BAD_CONTENT_ENCODING",
    "OBSOLETE (62)",
    "FILESIZE_EXCEEDED",
    "USE_SSL_FAILED",
    "SEND_FAIL_REWIND",
    "SSL_ENGINE_INITFAILED",
    "LOGIN_DENIED",
    "TFTP_NOTFOUND",
    "TFTP_PERM",
    "REMOTE_DISK_FULL",
    "TFTP_ILLEGAL",
    "TFTP_UNKNOWNID",
    "REMOTE_FILE_EXISTS",
    "TFTP_NOSUCHUSER",
    "OBSOLETE (75)",
    "OBSOLETE (76)",
    "SSL_CACERT_BADFILE",
    "REMOTE_FILE_NOT_FOUND",
    "SSH",
    "SSL_SHUTDOWN_FAILED",
    "AGAIN",
    "SSL_CRL_BADFILE",
    "SSL_ISSUER_ERROR",
    "FTP_PRET_FAILED",
    "RTSP_CSEQ_ERROR",
    "RTSP_SESSION_ERROR",
    "FTP_BAD_FILE_LIST",
    "CHUNK_FAILED",
    "NO_CONNECTION_AVAILABLE",
    "SSL_PINNEDPUBKEYNOTMATCH",
    "SSL_INVALIDCERTSTATUS",
    "HTTP2_STREAM",
    "RECURSIVE_API_CALL",
    "AUTH_ERROR",
    "HTTP3",
    "QUIC_CONNECT_ERROR",
    "PROXY",
    "SSL_CLIENTCERT",
    "UNRECOVERABLE_POLL"
  ]

  @doc """
  Returns the integer code for the corresponding string error message.

  Returns `-1` if the message is not a valid curl error code.

  ## Examples


      iex> ExCurl.CurlErrorCodes.get_code("URL_MALFORMAT")
      3

      iex> ExCurl.CurlErrorCodes.get_code("DOESN'T EXIST")
      -1
  """
  def get_code(message) when message in @all_error_codes,
    do: Enum.find_index(@all_error_codes, &(&1 == message))

  def get_code(_), do: -1

  @doc """
  Returns the string message for a coresponding integer error code.

  Returns `"CODE_OUT_OF_RANGE` if the value is not a valid curl error code.

  ## Examples


      iex> ExCurl.CurlErrorCodes.get_message(3)
      "URL_MALFORMAT"

      iex> ExCurl.CurlErrorCodes.get_message(256)
      "CODE_OUT_OF_RANGE"
  """
  def get_message(code) when is_integer(code) and code >= 0 and code <= 99,
    do: Enum.at(@all_error_codes, code)

  def get_message(_), do: "CODE_OUT_OF_RANGE"
end