Current section
Files
Jump to
Current section
Files
lib/bingex/swap/model/detailed_position_update.ex
defmodule Bingex.Swap.Model.DetailedPositionUpdate do
@moduledoc """
Represents detailed position update information for a swap contract.
"""
import Bingex.{Helpers, Convertors}
alias Bingex.Types
defstruct [
:id,
:symbol,
:side,
:isolated?,
:leverage,
:open_time,
:update_time,
:average_price,
:average_close_price,
:quantity,
:close_quantity,
:net_profit,
:realised_profit,
:fee,
:funding,
:closed?
]
@type t() :: %__MODULE__{
id: nil | binary(),
symbol: nil | binary(),
side: nil | Types.position_side(),
isolated?: nil | boolean(),
leverage: nil | pos_integer(),
open_time: nil | non_neg_integer(),
update_time: nil | non_neg_integer(),
average_price: nil | float(),
average_close_price: nil | float(),
quantity: nil | float(),
close_quantity: nil | float(),
net_profit: nil | float(),
realised_profit: nil | float(),
fee: nil | float(),
funding: nil | float(),
closed?: nil | boolean()
}
@spec decode(term()) :: {:ok, t()} | :error
def decode(%{} = data) do
{:ok,
%__MODULE__{
id: get_and_transform(data, "positionId", &to_non_empty_binary/1),
symbol: get_and_transform(data, "symbol", &to_non_empty_binary/1),
side: get_and_transform(data, "positionSide", &decode_position_side/1),
isolated?: get_and_transform(data, "isolated", &to_boolean/1),
leverage: get_and_transform(data, "leverage", &to_integer/1),
open_time: get_and_transform(data, "openTime", &to_non_neg_integer/1),
update_time: get_and_transform(data, "updateTime", &to_non_neg_integer/1),
average_price: get_and_transform(data, "avgPrice", &to_float/1),
average_close_price: get_and_transform(data, "avgClosePrice", &to_float/1),
quantity: get_and_transform(data, "positionAmt", &to_float/1),
close_quantity: get_and_transform(data, "closePositionAmt", &to_float/1),
net_profit: get_and_transform(data, "netProfit", &to_float/1),
realised_profit: get_and_transform(data, "realisedProfit", &to_float/1),
fee: get_and_transform(data, "positionCommission", &to_float/1),
funding: get_and_transform(data, "totalFunding", &to_float/1),
closed?: get_and_transform(data, "closeAllPositions", &to_boolean/1)
}}
end
def decode(_data), do: :error
end