Current section

Files

Jump to
bingex lib bingex swap data cancel_all_orders_data.ex
Raw

lib/bingex/swap/data/cancel_all_orders_data.ex

defmodule Bingex.Swap.CancelAllOrdersData do
@moduledoc """
Parses and structures response data for closing all swap positions on BingX.
This module extracts and formats the list of successfully and unsuccessfully closed positions
from API responses. It also provides a utility to embed the parsed data into a `Bingex.API.Reply`.
"""
alias Bingex.API.Reply
alias Bingex.Swap.DetailedOrderInfo
import Bingex.Helpers
import Bingex.Convertors
defstruct [:failed, :succeeded]
@type t() :: %__MODULE__{
succeeded: [binary()],
failed: [binary()]
}
@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
def embed_in_reply(%Reply{data: _} = reply), do: reply
@spec decode(any()) :: {:ok, t()} | :error
def decode(%{"data" => data}) when is_map(data) do
succeeded_raw =
get_and_transform(data, "success", [], &to_list/1) || []
failed_raw =
get_and_transform(data, "failed", [], &to_list/1) || []
failed =
failed_raw
|> Enum.map(&to_non_empty_binary/1)
|> reject_nils()
succeeded =
Enum.reduce(succeeded_raw, [], fn raw_order, orders ->
case DetailedOrderInfo.decode(raw_order) do
{:ok, order} -> [order | orders]
:error -> orders
end
end)
struct = %__MODULE__{
failed: failed,
succeeded: succeeded,
}
{:ok, struct}
end
def decode(_data), do: :error
end