Current section
Files
Jump to
Current section
Files
src/coinglecko@exchanges.erl
-module(coinglecko@exchanges).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/coinglecko/exchanges.gleam").
-export([list_request/1, get_by_id_request/2, tickers_request/6, list/2, decode_exchange_list/1, get_by_id/3, decode_exchange/1, tickers/7, decode_exchange_tickers/1]).
-export_type([exchange_list_item/0, exchange/0, exchange_ticker/0, exchange_tickers_response/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(" Exchange data endpoints.\n").
-type exchange_list_item() :: {exchange_list_item, binary(), binary()}.
-type exchange() :: {exchange,
binary(),
binary(),
gleam@option:option(integer()),
gleam@option:option(binary()),
gleam@option:option(integer()),
gleam@option:option(integer()),
float()}.
-type exchange_ticker() :: {exchange_ticker,
binary(),
binary(),
binary(),
binary(),
float(),
float(),
gleam@option:option(binary())}.
-type exchange_tickers_response() :: {exchange_tickers_response,
binary(),
list(exchange_ticker())}.
-file("src/coinglecko/exchanges.gleam", 52).
?DOC(" Build a request to get list of all supported exchanges.\n").
-spec list_request(coinglecko@client:client()) -> {ok,
gleam@http@request:request(binary())} |
{error, coinglecko@error:coin_gecko_error()}.
list_request(Client) ->
coinglecko@request:build_get_request(Client, <<"/exchanges/list"/utf8>>, []).
-file("src/coinglecko/exchanges.gleam", 70).
?DOC(" Build a request to get detailed data for a specific exchange.\n").
-spec get_by_id_request(coinglecko@client:client(), binary()) -> {ok,
gleam@http@request:request(binary())} |
{error, coinglecko@error:coin_gecko_error()}.
get_by_id_request(Client, Id) ->
coinglecko@request:build_get_request(
Client,
<<"/exchanges/"/utf8, Id/binary>>,
[]
).
-file("src/coinglecko/exchanges.gleam", 92).
?DOC(" Build a request to get tickers for a specific exchange.\n").
-spec tickers_request(
coinglecko@client:client(),
binary(),
gleam@option:option(binary()),
gleam@option:option(integer()),
gleam@option:option(binary()),
gleam@option:option(boolean())
) -> {ok, gleam@http@request:request(binary())} |
{error, coinglecko@error:coin_gecko_error()}.
tickers_request(Client, Id, Coin_ids, Page, Order, Depth) ->
Query = coinglecko@request:optional_params(
[{<<"coin_ids"/utf8>>, Coin_ids},
{<<"page"/utf8>>,
gleam@option:map(Page, fun erlang:integer_to_binary/1)},
{<<"order"/utf8>>, Order},
{<<"depth"/utf8>>,
gleam@option:map(Depth, fun coinglecko@request:bool_to_string/1)}]
),
coinglecko@request:build_get_request(
Client,
<<<<"/exchanges/"/utf8, Id/binary>>/binary, "/tickers"/utf8>>,
Query
).
-file("src/coinglecko/exchanges.gleam", 166).
-spec exchange_list_item_decoder() -> gleam@dynamic@decode:decoder(exchange_list_item()).
exchange_list_item_decoder() ->
gleam@dynamic@decode:field(
<<"id"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Id) ->
gleam@dynamic@decode:field(
<<"name"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Name) ->
gleam@dynamic@decode:success({exchange_list_item, Id, Name})
end
)
end
).
-file("src/coinglecko/exchanges.gleam", 57).
?DOC(" Get list of all supported exchanges (id and name only).\n").
-spec list(
coinglecko@client:client(),
fun((gleam@http@request:request(binary())) -> {ok,
gleam@http@response:response(binary())} |
{error, binary()})
) -> {ok, list(exchange_list_item())} |
{error, coinglecko@error:coin_gecko_error()}.
list(Client, Sender) ->
gleam@result:'try'(
list_request(Client),
fun(Req) ->
coinglecko@request:send_and_decode(
Req,
gleam@dynamic@decode:list(exchange_list_item_decoder()),
Sender
)
end
).
-file("src/coinglecko/exchanges.gleam", 143).
?DOC(" Decode an exchange list from a JSON string.\n").
-spec decode_exchange_list(binary()) -> {ok, list(exchange_list_item())} |
{error, coinglecko@error:coin_gecko_error()}.
decode_exchange_list(Json_string) ->
_pipe = gleam@json:parse(
Json_string,
gleam@dynamic@decode:list(exchange_list_item_decoder())
),
gleam@result:map_error(_pipe, fun(Field@0) -> {decode_error, Field@0} end).
-file("src/coinglecko/exchanges.gleam", 172).
-spec exchange_decoder() -> gleam@dynamic@decode:decoder(exchange()).
exchange_decoder() ->
gleam@dynamic@decode:field(
<<"id"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Id) ->
gleam@dynamic@decode:field(
<<"name"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Name) ->
gleam@dynamic@decode:optional_field(
<<"year_established"/utf8>>,
none,
gleam@dynamic@decode:optional(
{decoder, fun gleam@dynamic@decode:decode_int/1}
),
fun(Year_established) ->
gleam@dynamic@decode:optional_field(
<<"country"/utf8>>,
none,
gleam@dynamic@decode:optional(
{decoder,
fun gleam@dynamic@decode:decode_string/1}
),
fun(Country) ->
gleam@dynamic@decode:optional_field(
<<"trust_score"/utf8>>,
none,
gleam@dynamic@decode:optional(
{decoder,
fun gleam@dynamic@decode:decode_int/1}
),
fun(Trust_score) ->
gleam@dynamic@decode:optional_field(
<<"trust_score_rank"/utf8>>,
none,
gleam@dynamic@decode:optional(
{decoder,
fun gleam@dynamic@decode:decode_int/1}
),
fun(Trust_score_rank) ->
gleam@dynamic@decode:field(
<<"trade_volume_24h_btc"/utf8>>,
coinglecko@request:flexible_float(
),
fun(
Trade_volume_24h_btc
) ->
gleam@dynamic@decode:success(
{exchange,
Id,
Name,
Year_established,
Country,
Trust_score,
Trust_score_rank,
Trade_volume_24h_btc}
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/coinglecko/exchanges.gleam", 78).
?DOC(" Get detailed data for a specific exchange.\n").
-spec get_by_id(
coinglecko@client:client(),
binary(),
fun((gleam@http@request:request(binary())) -> {ok,
gleam@http@response:response(binary())} |
{error, binary()})
) -> {ok, exchange()} | {error, coinglecko@error:coin_gecko_error()}.
get_by_id(Client, Id, Sender) ->
gleam@result:'try'(
get_by_id_request(Client, Id),
fun(Req) ->
coinglecko@request:send_and_decode(Req, exchange_decoder(), Sender)
end
).
-file("src/coinglecko/exchanges.gleam", 151).
?DOC(" Decode an exchange detail from a JSON string.\n").
-spec decode_exchange(binary()) -> {ok, exchange()} |
{error, coinglecko@error:coin_gecko_error()}.
decode_exchange(Json_string) ->
_pipe = gleam@json:parse(Json_string, exchange_decoder()),
gleam@result:map_error(_pipe, fun(Field@0) -> {decode_error, Field@0} end).
-file("src/coinglecko/exchanges.gleam", 210).
-spec exchange_ticker_decoder() -> gleam@dynamic@decode:decoder(exchange_ticker()).
exchange_ticker_decoder() ->
gleam@dynamic@decode:field(
<<"base"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Base) ->
gleam@dynamic@decode:field(
<<"target"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Target) ->
gleam@dynamic@decode:field(
<<"coin_id"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Coin_id) ->
gleam@dynamic@decode:field(
<<"target_coin_id"/utf8>>,
{decoder,
fun gleam@dynamic@decode:decode_string/1},
fun(Target_coin_id) ->
gleam@dynamic@decode:field(
<<"last"/utf8>>,
coinglecko@request:flexible_float(),
fun(Last) ->
gleam@dynamic@decode:field(
<<"volume"/utf8>>,
coinglecko@request:flexible_float(
),
fun(Volume) ->
gleam@dynamic@decode:optional_field(
<<"trust_score"/utf8>>,
none,
gleam@dynamic@decode:optional(
{decoder,
fun gleam@dynamic@decode:decode_string/1}
),
fun(Trust_score) ->
gleam@dynamic@decode:success(
{exchange_ticker,
Base,
Target,
Coin_id,
Target_coin_id,
Last,
Volume,
Trust_score}
)
end
)
end
)
end
)
end
)
end
)
end
)
end
).
-file("src/coinglecko/exchanges.gleam", 233).
-spec exchange_tickers_response_decoder() -> gleam@dynamic@decode:decoder(exchange_tickers_response()).
exchange_tickers_response_decoder() ->
gleam@dynamic@decode:field(
<<"name"/utf8>>,
{decoder, fun gleam@dynamic@decode:decode_string/1},
fun(Name) ->
gleam@dynamic@decode:field(
<<"tickers"/utf8>>,
gleam@dynamic@decode:list(exchange_ticker_decoder()),
fun(Tickers) ->
gleam@dynamic@decode:success(
{exchange_tickers_response, Name, Tickers}
)
end
)
end
).
-file("src/coinglecko/exchanges.gleam", 116).
?DOC(" Get tickers for a specific exchange.\n").
-spec tickers(
coinglecko@client:client(),
binary(),
gleam@option:option(binary()),
gleam@option:option(integer()),
gleam@option:option(binary()),
gleam@option:option(boolean()),
fun((gleam@http@request:request(binary())) -> {ok,
gleam@http@response:response(binary())} |
{error, binary()})
) -> {ok, exchange_tickers_response()} |
{error, coinglecko@error:coin_gecko_error()}.
tickers(Client, Id, Coin_ids, Page, Order, Depth, Sender) ->
gleam@result:'try'(
tickers_request(Client, Id, Coin_ids, Page, Order, Depth),
fun(Req) ->
coinglecko@request:send_and_decode(
Req,
exchange_tickers_response_decoder(),
Sender
)
end
).
-file("src/coinglecko/exchanges.gleam", 157).
?DOC(" Decode exchange tickers from a JSON string.\n").
-spec decode_exchange_tickers(binary()) -> {ok, exchange_tickers_response()} |
{error, coinglecko@error:coin_gecko_error()}.
decode_exchange_tickers(Json_string) ->
_pipe = gleam@json:parse(Json_string, exchange_tickers_response_decoder()),
gleam@result:map_error(_pipe, fun(Field@0) -> {decode_error, Field@0} end).