lib/aptos/tx/payload.ex

defmodule Aptos.Tx.Payload do
  defmodule Script do
    @moduledoc false

    defstruct [:code, :type_arguments, :arguments]

    @type t() :: %__MODULE__{
            code: map(),
            type_arguments: list(String.t()),
            arguments: list()
          }

    def new(attrs \\ []) do
      struct(__MODULE__, attrs)
    end
  end

  defmodule ModuleBundle do
    @moduledoc false

    defstruct [:modules]

    @type t() :: %__MODULE__{modules: list(map())}

    def new(attrs \\ []) do
      struct(__MODULE__, attrs)
    end
  end

  defmodule EntryFunction do
    alias BCS.DataType, as: T
    alias Aptos.Tx.FuncTag

    defstruct [:func_tag, :arguments]

    @type t() :: %__MODULE__{
            func_tag: FuncTag.t(),
            arguments: list()
          }

    @spec bcs_layout(list(T.t()), list(T.t())) :: keyword(T.t())
    def bcs_layout(t_args_layout, arg_layout) do
      [
        func_tag: FuncTag.t(t_args_layout),
        arguments: T.DoubleEncode.t(arg_layout)
      ]
    end

    def new(attrs \\ []) do
      struct(__MODULE__, attrs)
    end
  end

  @type t :: Script.t() | ModuleBundle.t() | EntryFunction.t()

  alias BCS.DataType, as: T

  @spec bcs_layout(:entry_function, list(T.t()), list(T.t())) :: T.Choice.t()
  def bcs_layout(:entry_function, t_args_layout, arg_layout) do
    EntryFunction.bcs_layout(t_args_layout, arg_layout)
    |> T.Struct.t()
    |> T.Choice.t(2)
  end
end