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