lib/script/opcodes/pseudo_words/invalid_opcode.ex

defmodule BitcoinLib.Script.Opcodes.PseudoWords.InvalidOpcode do
  @moduledoc """
  Based on https://en.bitcoin.it/wiki/Script

  Word OP_INVALIDOPCODE
  Opcode 255
  Hex 0xff
  Matches any opcode that is not yet assigned.
  """

  @behaviour BitcoinLib.Script.Opcode

  defstruct []

  alias BitcoinLib.Script.Opcodes.PseudoWords.InvalidOpcode

  @value 0xFF

  @doc """
  Returns 0xff

  ## Examples
      iex> BitcoinLib.Script.Opcodes.PseudoWords.InvalidOpcode.v()
      0xff
  """
  @spec v() :: 0xFF
  def v do
    @value
  end

  @doc """
  Returns <<0xff>>

  ## Examples
      iex> BitcoinLib.Script.Opcodes.PseudoWords.InvalidOpcode.encode()
      <<0xff>>
  """
  @spec encode() :: <<_::8>>
  def encode() do
    <<@value::8>>
  end

  @doc """
  Matches any opcode that is not yet assigned.

  Will fail by design.

  ## Examples
      iex> BitcoinLib.Script.Opcodes.PseudoWords.InvalidOpcode.execute(
      ...>  %BitcoinLib.Script.Opcodes.PseudoWords.InvalidOpcode{},
      ...>  [3]
      ...> )
      {:error, "hit a OP_INVALIDOPCODE"}
  """
  def execute(%InvalidOpcode{}, _remaining) do
    {:error, "hit a OP_INVALIDOPCODE"}
  end
end