Current section
Files
Jump to
Current section
Files
lib/bingex/swap/data/get_leverage_data.ex
defmodule Bingex.Swap.GetLeverageData do
@moduledoc """
Processes leverage info response data for BingX swaps.
"""
alias Bingex.API.Reply
import Bingex.{Helpers, Convertors}
defstruct [
:symbol,
:available_long_quantity,
:available_short_quantity,
:available_long_value,
:available_short_value,
:max_long_value,
:max_short_value,
:max_long_leverage,
:max_short_leverage,
:long_leverage,
:short_leverage
]
@type t() :: %__MODULE__{
symbol: binary(),
available_long_quantity: float(),
available_long_value: float(),
max_long_value: float(),
available_short_quantity: float(),
available_short_value: float(),
max_short_value: float(),
max_long_leverage: integer(),
max_short_leverage: integer(),
long_leverage: integer(),
short_leverage: integer()
}
@spec embed_in_reply(Reply.t()) :: Reply.t(t())
def embed_in_reply(%Reply{payload: payload} = reply) do
case decode(payload) do
{:ok, data} -> Reply.put_data(reply, data)
:error -> reply
end
end
@spec decode(any()) :: {:ok, t()} | :error
def decode(%{"data" => data}) when map_size(data) > 0 do
struct = %__MODULE__{
symbol: get_and_transform(data, "symbol", &to_non_empty_binary/1),
available_long_quantity: get_and_transform(data, "availableLongVol", &to_float/1),
available_long_value: get_and_transform(data, "availableLongVal", &to_float/1),
max_long_value: get_and_transform(data, "maxPositionLongVal", &to_float/1),
available_short_quantity: get_and_transform(data, "availableShortVol", &to_float/1),
available_short_value: get_and_transform(data, "availableShortVal", &to_float/1),
max_short_value: get_and_transform(data, "maxPositionShortVal", &to_float/1),
max_long_leverage: get_and_transform(data, "maxLongLeverage", &to_integer/1),
max_short_leverage: get_and_transform(data, "maxShortLeverage", &to_integer/1),
long_leverage: get_and_transform(data, "longLeverage", &to_integer/1),
short_leverage: get_and_transform(data, "shortLeverage", &to_integer/1),
}
{:ok, struct}
end
def decode(_data), do: :error
end