Packages

A type-safe CoinGecko API client for Gleam

Current section

Files

Jump to
coinglecko src coinglecko@error.erl
Raw

src/coinglecko@error.erl

-module(coinglecko@error).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/coinglecko/error.gleam").
-export([parse_error_body/1, to_string/1]).
-export_type([coin_gecko_error/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(" Error types for the CoinGecko API client.\n").
-type coin_gecko_error() :: {http_error, binary()} |
{api_error, integer(), binary(), gleam@option:option(binary())} |
{decode_error, gleam@json:decode_error()} |
{request_error, binary()}.
-file("src/coinglecko/error.gleam", 25).
?DOC(
" Try to extract an error message from a CoinGecko error response body.\n"
" CoinGecko returns `{\"error\": \"message\"}` for some errors, and HTML for others.\n"
).
-spec parse_error_body(binary()) -> gleam@option:option(binary()).
parse_error_body(Body) ->
Decoder = begin
gleam@dynamic@decode:field(
<<"error"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Message) -> gleam@dynamic@decode:success(Message) end
)
end,
case gleam@json:parse(Body, Decoder) of
{ok, Message@1} ->
{some, Message@1};
{error, _} ->
none
end.
-file("src/coinglecko/error.gleam", 37).
?DOC(" Convert an error to a human-readable string.\n").
-spec to_string(coin_gecko_error()) -> binary().
to_string(Error) ->
case Error of
{http_error, Message} ->
<<"HTTP error: "/utf8, Message/binary>>;
{api_error, Status, Body, Error_message} ->
case Error_message of
{some, Msg} ->
<<<<<<"API error (status "/utf8,
(erlang:integer_to_binary(Status))/binary>>/binary,
"): "/utf8>>/binary,
Msg/binary>>;
none ->
<<<<<<"API error (status "/utf8,
(erlang:integer_to_binary(Status))/binary>>/binary,
"): "/utf8>>/binary,
Body/binary>>
end;
{decode_error, _} ->
<<"Failed to decode API response"/utf8>>;
{request_error, Message@1} ->
<<"Request error: "/utf8, Message@1/binary>>
end.