-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).