defmodule Stellar.TxBuild.AssetsPath do @moduledoc """ `AssetsPath` struct definition. """ alias Stellar.TxBuild.Asset alias StellarBase.XDR.Assets @behaviour Stellar.TxBuild.XDR @type assets :: Asset.t() | list(Asset.t()) @type error :: {:error, atom()} @type t :: %__MODULE__{assets: list(Asset.t())} defstruct [:assets] @impl true def new(assets \\ [], opts \\ []) def new(assets, _opts) do build_path(%__MODULE__{assets: []}, assets) end @impl true def to_xdr(%__MODULE__{assets: assets}) do assets |> Enum.map(&Asset.to_xdr/1) |> Assets.new() end @spec build_path(path :: t(), assets :: assets()) :: t() | error() defp build_path(%__MODULE__{} = path, []), do: path defp build_path(%__MODULE__{} = path, [asset | assets]) do with %Asset{} = asset <- Asset.new(asset) do path |> build_path(asset) |> build_path(assets) end end defp build_path(%__MODULE__{assets: assets} = path, %Asset{} = asset) do %{path | assets: assets ++ [asset]} end end