lib/code_runner.ex

defmodule ArweaveSdkEx.CodeRunner do
  @moduledoc """
    Run codes storage in arweave TX.
  """
  def get_ex_by_tx_id(node, tx_id) do
    {:ok, %{decoded_tags: decoded_tags}} =ArweaveSdkEx.get_tx(node, tx_id)
    type = Map.get(decoded_tags, :"Content-Type")

    if_record = has_if_record(decoded_tags)
    case do_get_ex_by_tx_id(node, tx_id, type) do
      {:ok, content} ->
        {:ok, %{code: content, if_record: if_record}}
      {:error, msg} ->
        {:error, msg}
    end
  end

  defp do_get_ex_by_tx_id(node, tx_hash, "application/elixir") do
    {:ok, %{content: content}} = ArweaveSdkEx.get_content_in_tx(node, tx_hash)
    {:ok, content}
  end

  defp do_get_ex_by_tx_id(_node, _tx_id, _other_type) do
    {:error, "it's not a elixir func"}
  end

  def has_if_record(decoded_tags) do
    raw_res = Map.get(decoded_tags, "If-Record")
    if is_nil(raw_res) or raw_res=="0" do
      false
    else
      true
    end
  end

  # +--------+
  # | runner |
  # +--------+

  def run_ex(code, params_map) do
    params_list = Map.to_list(params_map)
    {result, _} = Code.eval_string(code, params_list, __ENV__)
    %{output: result, input: params_map}
  end

  def run_func(mod_name, func_name, params) do
    func_name_atom = String.to_atom(func_name)
    "Elixir.#{mod_name}"
    |> String.to_atom()
    |> apply(func_name_atom, params)
  end
end