Current section

Files

Jump to
bingex lib bingex user data get_sub_accounts.ex
Raw

lib/bingex/user/data/get_sub_accounts.ex

defmodule Bingex.User.Data.GetSubAccounts do
@moduledoc """
Represents response content on `Bingex.User.get_sub_accounts` request.
"""
import Bingex.{Helpers, Convertors}
alias Bingex.API.Reply
alias Bingex.User.Model.SubAccountInfo
defstruct [:page_id, :total, sub_accounts: []]
@type t() :: %__MODULE__{
sub_accounts: [SubAccountInfo.t()],
page_id: nil | integer(),
total: nil | integer()
}
@spec embed_in_reply(Reply.t()) :: Reply.t(t())
def embed_in_reply(%Reply{payload: payload} = reply) do
Reply.put_data(reply, decode(payload))
end
@spec decode(any()) :: t()
def decode(%{"data" => %{} = data}) do
%__MODULE__{
sub_accounts: Map.get(data, "result", []) |> decode_result(),
page_id: get_and_transform(data, "pageId", &to_integer/1),
total: get_and_transform(data, "total", &to_integer/1)
}
end
def decode(_payload), do: %__MODULE__{}
defp decode_result(infos) when is_list(infos) do
Enum.reduce(infos, [], fn info, acc ->
case SubAccountInfo.decode(info) do
{:ok, v} -> [v | acc]
:error -> acc
end
end)
|> Enum.reverse()
end
defp decode_result(_), do: []
end