-module(glupbit@quotation@orderbook). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/glupbit/quotation/orderbook.gleam"). -export([orderbook_decoder/0, get_orderbooks/4, get_supported_levels/2, orderbook_instrument_decoder/0, get_orderbook_instruments/2]). -export_type([orderbook/0, orderbook_unit/0, orderbook_level/0, orderbook_instrument/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(" Orderbook data — `GET /orderbook`, `/supported_levels`, `/instruments`.\n"). -type orderbook() :: {orderbook, binary(), integer(), float(), float(), list(orderbook_unit()), gleam@option:option(float())}. -type orderbook_unit() :: {orderbook_unit, float(), float(), float(), float()}. -type orderbook_level() :: {orderbook_level, binary(), list(integer())}. -type orderbook_instrument() :: {orderbook_instrument, binary(), binary(), binary(), list(binary())}. -file("src/glupbit/quotation/orderbook.gleam", 13). ?DOC(" Decode a JSON number as Float, accepting both float and int values.\n"). -spec number() -> gleam@dynamic@decode:decoder(float()). number() -> gleam@dynamic@decode:one_of( {decoder, fun gleam@dynamic@decode:decode_float/1}, [begin _pipe = {decoder, fun gleam@dynamic@decode:decode_int/1}, gleam@dynamic@decode:map(_pipe, fun erlang:float/1) end] ). -file("src/glupbit/quotation/orderbook.gleam", 127). -spec orderbook_unit_decoder() -> gleam@dynamic@decode:decoder(orderbook_unit()). orderbook_unit_decoder() -> gleam@dynamic@decode:field( <<"ask_price"/utf8>>, number(), fun(Ask_price) -> gleam@dynamic@decode:field( <<"bid_price"/utf8>>, number(), fun(Bid_price) -> gleam@dynamic@decode:field( <<"ask_size"/utf8>>, number(), fun(Ask_size) -> gleam@dynamic@decode:field( <<"bid_size"/utf8>>, number(), fun(Bid_size) -> gleam@dynamic@decode:success( {orderbook_unit, Ask_price, Bid_price, Ask_size, Bid_size} ) end ) end ) end ) end ). -file("src/glupbit/quotation/orderbook.gleam", 107). ?DOC(" Decoder for an Orderbook JSON object.\n"). -spec orderbook_decoder() -> gleam@dynamic@decode:decoder(orderbook()). orderbook_decoder() -> gleam@dynamic@decode:field( <<"market"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Market) -> gleam@dynamic@decode:field( <<"timestamp"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_int/1}, fun(Timestamp) -> gleam@dynamic@decode:field( <<"total_ask_size"/utf8>>, number(), fun(Total_ask_size) -> gleam@dynamic@decode:field( <<"total_bid_size"/utf8>>, number(), fun(Total_bid_size) -> gleam@dynamic@decode:field( <<"orderbook_units"/utf8>>, gleam@dynamic@decode:list( orderbook_unit_decoder() ), fun(Orderbook_units) -> gleam@dynamic@decode:optional_field( <<"level"/utf8>>, none, gleam@dynamic@decode:optional( number() ), fun(Level) -> gleam@dynamic@decode:success( {orderbook, Market, Timestamp, Total_ask_size, Total_bid_size, Orderbook_units, Level} ) end ) end ) end ) end ) end ) end ). -file("src/glupbit/quotation/orderbook.gleam", 55). ?DOC(" Get orderbooks for trading pairs.\n"). -spec get_orderbooks( glupbit@client:public_client(), list(glupbit@types:market()), gleam@option:option(binary()), gleam@option:option(integer()) ) -> {ok, glupbit@types:api_response(list(orderbook()))} | {error, glupbit@types:api_error()}. get_orderbooks(C, Markets, Level, Count) -> Codes = begin _pipe = Markets, _pipe@1 = gleam@list:map(_pipe, fun glupbit@types:market_to_string/1), gleam@string:join(_pipe@1, <<","/utf8>>) end, Query = begin _pipe@4 = [{some, {<<"markets"/utf8>>, Codes}}, begin _pipe@2 = Level, gleam@option:map(_pipe@2, fun(L) -> {<<"level"/utf8>>, L} end) end, begin _pipe@3 = Count, gleam@option:map( _pipe@3, fun(N) -> {<<"count"/utf8>>, erlang:integer_to_binary(N)} end ) end], gleam@option:values(_pipe@4) end, glupbit@client:public_get( C, <<"/orderbook"/utf8>>, Query, gleam@dynamic@decode:list(orderbook_decoder()) ). -file("src/glupbit/quotation/orderbook.gleam", 135). -spec orderbook_level_decoder() -> gleam@dynamic@decode:decoder(orderbook_level()). orderbook_level_decoder() -> gleam@dynamic@decode:field( <<"market"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Market) -> gleam@dynamic@decode:field( <<"supported_levels"/utf8>>, gleam@dynamic@decode:list( {decoder, fun gleam@dynamic@decode:decode_int/1} ), fun(Supported_levels) -> gleam@dynamic@decode:success( {orderbook_level, Market, Supported_levels} ) end ) end ). -file("src/glupbit/quotation/orderbook.gleam", 78). ?DOC(" Get supported orderbook levels.\n"). -spec get_supported_levels( glupbit@client:public_client(), list(glupbit@types:market()) ) -> {ok, glupbit@types:api_response(list(orderbook_level()))} | {error, glupbit@types:api_error()}. get_supported_levels(C, Markets) -> Codes = begin _pipe = Markets, _pipe@1 = gleam@list:map(_pipe, fun glupbit@types:market_to_string/1), gleam@string:join(_pipe@1, <<","/utf8>>) end, glupbit@client:public_get( C, <<"/orderbook/supported_levels"/utf8>>, [{<<"markets"/utf8>>, Codes}], gleam@dynamic@decode:list(orderbook_level_decoder()) ). -file("src/glupbit/quotation/orderbook.gleam", 145). ?DOC(" Decoder for an OrderbookInstrument JSON object.\n"). -spec orderbook_instrument_decoder() -> gleam@dynamic@decode:decoder(orderbook_instrument()). orderbook_instrument_decoder() -> gleam@dynamic@decode:field( <<"market"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Market) -> gleam@dynamic@decode:field( <<"quote_currency"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Quote_currency) -> gleam@dynamic@decode:field( <<"tick_size"/utf8>>, {decoder, fun gleam@dynamic@decode:decode_string/1}, fun(Tick_size) -> gleam@dynamic@decode:field( <<"supported_levels"/utf8>>, gleam@dynamic@decode:list( {decoder, fun gleam@dynamic@decode:decode_string/1} ), fun(Supported_levels) -> gleam@dynamic@decode:success( {orderbook_instrument, Market, Quote_currency, Tick_size, Supported_levels} ) end ) end ) end ) end ). -file("src/glupbit/quotation/orderbook.gleam", 93). ?DOC( " Get orderbook instruments (tick size and supported levels) for trading pairs.\n" " `GET /orderbook/instruments`\n" ). -spec get_orderbook_instruments( glupbit@client:public_client(), list(glupbit@types:market()) ) -> {ok, glupbit@types:api_response(list(orderbook_instrument()))} | {error, glupbit@types:api_error()}. get_orderbook_instruments(C, Markets) -> Codes = begin _pipe = Markets, _pipe@1 = gleam@list:map(_pipe, fun glupbit@types:market_to_string/1), gleam@string:join(_pipe@1, <<","/utf8>>) end, glupbit@client:public_get( C, <<"/orderbook/instruments"/utf8>>, [{<<"markets"/utf8>>, Codes}], gleam@dynamic@decode:list(orderbook_instrument_decoder()) ).