lib/cli/module_converter.ex

defmodule Giocci.CLI.ModuleConverter do
  @doc """
  moduleをBase64エンコードする。

  ## Example
      iex> Giocci.CLI.ModuleConverter.encode(MODULE_NAME)
  """
  def encode(module) do
    module
    |> :code.get_object_code()
    |> :erlang.term_to_binary()
    |> Base.encode64()
  end

  @doc """
  Base64エンコードされたmoduleをデコードする。

  ## Exmaple
      iex> Giocci.CLI.ModuleConverter.decode(encode_module)
  """
  def decode(encode_module) do
    {name, binary, path} =
      encode_module
      |> Base.decode64!()
      |> :erlang.binary_to_term()

    {name, binary, path}
  end

  @doc """
  デコードされたmoduleを読み込む。

  ## Example
      iex> Giocci.CLI.ModuleConverter.load({name, binary, path})
      or
      iex> Giocci.CLI.ModuleConverter.decode(encode_module) |> Giocci.CLI.ModuleConverter.load()
  """
  def load({name, binary, path}) do
    :code.load_binary(name, path, binary)
  end
end