lib/tx_build/trustline_flags.ex

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

  @behaviour Stellar.TxBuild.XDR

  @type flags :: list(atom())

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

  defstruct [:value]

  @flags [authorized: 0x1, maintain_liabilities: 0x2]

  @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