defmodule BitcoinLib.Script.Opcode do @moduledoc """ Opcode behaviour, allowing execution and returning the opcode's integer value """ @doc """ Returns the opcode's value """ @callback v() :: byte() @doc """ Attemps to execute the opcode against the stack given as an argument, returning either the altered stack or an error """ @callback execute(any(), list()) :: {:ok, list()} | {:error, binary()} alias BitcoinLib.Script.Opcodes.Data @type t :: Data @spec execute(Data.t(), list()) :: {:ok, list()} def execute(%Data{value: value}, stack) do {:ok, [value | stack]} end @spec execute(module(), list()) :: {:ok, list()} def execute(opcode, stack) do opcode.__struct__.execute(opcode, stack) end end