Current section

Files

Jump to
bingex lib bingex swap data cancel_all_orders.ex
Raw

lib/bingex/swap/data/cancel_all_orders.ex

defmodule Bingex.Swap.Data.CancelAllOrders do
@moduledoc """
Parses and structures response data for closing all swap positions on BingX.
"""
import Bingex.{Helpers, Convertors}
alias Bingex.API.Reply
alias Bingex.Swap.Model.DetailedOrderInfo
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