lib/tx_build/from_asset.ex

defmodule Stellar.TxBuild.FromAsset do
  @moduledoc """
  `FromAsset` struct definition.
  """
  import Stellar.TxBuild.Validations,
    only: [validate_string: 1, validate_asset: 1]

  alias StellarBase.XDR.{FromAsset, Hash}
  alias Stellar.TxBuild.Asset

  @type t :: %__MODULE__{
          network_id: binary(),
          asset: Asset.t()
        }

  @behaviour Stellar.TxBuild.XDR

  defstruct [:network_id, :asset]

  @impl true
  def new(args, opts \\ nil)

  def new(args, _opts) when is_list(args) do
    network_id = Keyword.get(args, :network_id)
    asset = Keyword.get(args, :asset)

    with {:ok, network_id} <- validate_string({:network_id, network_id}),
         {:ok, asset} <- validate_asset({:asset, asset}) do
      %__MODULE__{
        network_id: network_id,
        asset: asset
      }
    end
  end

  def new(_args, _opts), do: {:error, :invalid_from_asset}

  @impl true
  def to_xdr(%__MODULE__{
        network_id: network_id,
        asset: asset
      }) do
    network_id = Hash.new(network_id)
    asset = Asset.to_xdr(asset)

    FromAsset.new(network_id, asset)
  end

  def to_xdr(_error), do: {:error, :invalid_struct_from_asset}
end