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