lib/xdr/transactions/operations/hash_id_preimage_operation_id.ex

defmodule StellarBase.XDR.HashIDPreimageOperationID do
  @moduledoc """
  Automatically generated by xdrgen
  DO NOT EDIT or your changes may be overwritten

  Target implementation: elixir_xdr at https://hex.pm/packages/elixir_xdr

  Representation of Stellar `HashIDPreimageOperationID` type.
  """

  @behaviour XDR.Declaration

  alias StellarBase.XDR.{
    AccountID,
    SequenceNumber,
    UInt32
  }

  @struct_spec XDR.Struct.new(
                 source_account: AccountID,
                 seq_num: SequenceNumber,
                 op_num: UInt32
               )

  @type source_account_type :: AccountID.t()
  @type seq_num_type :: SequenceNumber.t()
  @type op_num_type :: UInt32.t()

  @type t :: %__MODULE__{
          source_account: source_account_type(),
          seq_num: seq_num_type(),
          op_num: op_num_type()
        }

  defstruct [:source_account, :seq_num, :op_num]

  @spec new(
          source_account :: source_account_type(),
          seq_num :: seq_num_type(),
          op_num :: op_num_type()
        ) :: t()
  def new(
        %AccountID{} = source_account,
        %SequenceNumber{} = seq_num,
        %UInt32{} = op_num
      ),
      do: %__MODULE__{source_account: source_account, seq_num: seq_num, op_num: op_num}

  @impl true
  def encode_xdr(%__MODULE__{source_account: source_account, seq_num: seq_num, op_num: op_num}) do
    [source_account: source_account, seq_num: seq_num, op_num: op_num]
    |> XDR.Struct.new()
    |> XDR.Struct.encode_xdr()
  end

  @impl true
  def encode_xdr!(%__MODULE__{source_account: source_account, seq_num: seq_num, op_num: op_num}) do
    [source_account: source_account, seq_num: seq_num, op_num: op_num]
    |> XDR.Struct.new()
    |> XDR.Struct.encode_xdr!()
  end

  @impl true
  def decode_xdr(bytes, struct \\ @struct_spec)

  def decode_xdr(bytes, struct) do
    case XDR.Struct.decode_xdr(bytes, struct) do
      {:ok,
       {%XDR.Struct{
          components: [source_account: source_account, seq_num: seq_num, op_num: op_num]
        }, rest}} ->
        {:ok, {new(source_account, seq_num, op_num), rest}}

      error ->
        error
    end
  end

  @impl true
  def decode_xdr!(bytes, struct \\ @struct_spec)

  def decode_xdr!(bytes, struct) do
    {%XDR.Struct{components: [source_account: source_account, seq_num: seq_num, op_num: op_num]},
     rest} = XDR.Struct.decode_xdr!(bytes, struct)

    {new(source_account, seq_num, op_num), rest}
  end
end