Current section
Files
Jump to
Current section
Files
lib/bingex/swap/model/contract_info.ex
defmodule Bingex.Swap.Model.ContractInfo do
@moduledoc """
Represents contract information for a swap contract.
"""
import Bingex.{Helpers, Convertors}
defstruct [
:contract_id,
:symbol,
:quantity_precision,
:price_precision,
:taker_fee_rate,
:maker_fee_rate,
:min_quantity,
:min_quote_amount,
:currency,
:asset,
:status,
:opening_status,
:closing_status,
:guaranteed_stop_status,
:guaranteed_stop_fee_rate,
:transactions_status,
:launch_time,
:maintain_time,
:off_time
]
@type contract_status() :: :online | :pre_online | :offline | :forbidden
@type t() :: %__MODULE__{
contract_id: nil | term(),
symbol: nil | binary(),
quantity_precision: nil | integer(),
price_precision: nil | integer(),
taker_fee_rate: nil | float(),
maker_fee_rate: nil | float(),
min_quantity: nil | float(),
min_quote_amount: nil | float(),
currency: nil | binary(),
asset: nil | binary(),
status: nil | contract_status(),
opening_status: nil | binary(),
closing_status: nil | binary(),
guaranteed_stop_status: nil | boolean(),
guaranteed_stop_fee_rate: nil | binary(),
transactions_status: nil | boolean(),
launch_time: nil | pos_integer(),
maintain_time: nil | pos_integer(),
off_time: nil | pos_integer()
}
@spec decode(any()) :: {:ok, t()} | :error
def decode(%{} = data) do
{:ok,
%__MODULE__{
contract_id: get_and_transform(data, "contractId", &to_non_empty_binary/1),
symbol: get_and_transform(data, "symbol", &to_non_empty_binary/1),
quantity_precision: get_and_transform(data, "quantityPrecision", &to_integer/1),
price_precision: get_and_transform(data, "pricePrecision", &to_integer/1),
taker_fee_rate: get_and_transform(data, "takerFeeRate", &to_float/1),
maker_fee_rate: get_and_transform(data, "makerFeeRate", &to_float/1),
min_quantity: get_and_transform(data, "tradeMinQuantity", &to_float/1),
min_quote_amount: get_and_transform(data, "tradeMinUSDT", &to_float/1),
currency: get_and_transform(data, "currency", &to_non_empty_binary/1),
asset: get_and_transform(data, "asset", &to_non_empty_binary/1),
status: get_and_transform(data, "status", &decode_contract_status/1),
opening_status: get_and_transform(data, "apiStateOpen", &to_boolean/1),
closing_status: get_and_transform(data, "apiStateClose", &to_boolean/1),
guaranteed_stop_status: get_and_transform(data, "ensureTrigger", &to_boolean/1),
guaranteed_stop_fee_rate: get_and_transform(data, "triggerFeeRate", &to_float/1),
transactions_status: get_and_transform(data, "brokerState", &to_boolean/1),
launch_time: get_and_transform(data, "launchTime", &to_integer/1),
maintain_time: get_and_transform(data, "maintainTime", &to_integer/1),
off_time: get_and_transform(data, "offTime", &to_integer/1)
}}
end
def decode(_data), do: :error
defp decode_contract_status(1), do: :online
defp decode_contract_status(25), do: :forbidden
defp decode_contract_status(5), do: :pre_online
defp decode_contract_status(0), do: :offline
defp decode_contract_status(_), do: nil
end