lib/tx_build/flags.ex

defmodule Stellar.TxBuild.Flags do
  @moduledoc """
  `Flags` struct definition.
  """
  alias StellarBase.XDR.UInt32

  @behaviour Stellar.TxBuild.XDR

  @type flags :: list(atom())

  @type t :: %__MODULE__{value: flags()}

  defstruct [:value]

  @flags [required: 0x1, revocable: 0x2, inmutable: 0x4, clawback_enabled: 0x8]

  @impl true
  def new(flags \\ [], opts \\ [])

  def new(flags, _opts) when is_list(flags) do
    %__MODULE__{value: flags_bit_mask(flags)}
  end

  def new(_value, _opts), do: {:error, :invalid_flags}

  @impl true
  def to_xdr(%__MODULE__{value: weight}) do
    UInt32.new(weight)
  end

  @spec flags_bit_mask(flags :: flags()) :: integer()
  defp flags_bit_mask(flags) do
    flags
    |> Enum.filter(&is_atom(&1))
    |> Enum.map(&Keyword.get(@flags, &1, 0x0))
    |> Enum.reduce(0, &(&1 + &2))
  end
end