lib/corner_helper.ex

defmodule CornerHelper do
  @moduledoc """
  This Module define macros to help debug code.
  """

  @doc """
  debug(v) use to print v pretty in the scrren, when the Mix.env is `:dev`.
  """
  defmacro debug(term, env) do
    if env || Mix.env() == :dev do
      quote [:generated, location: :keep] do
        file = __ENV__.file
        line = __ENV__.line
        sp_line = String.duplicate("-", 80)
        IO.puts(["\n", sp_line])
        term = unquote(term)
        IO.inspect(term, pretty: true)
        IO.puts("#{file}:#{line}")
        IO.puts([sp_line, "\n"])
        term
      end
    end
  end

  @doc """
  here() use to print a message show where the code run at, like "Now we are at
  <module>.<function>".
  """
  defmacro here(env \\ nil) do
    if env || Mix.env() == :dev do
      quote [:generated] do
        %{function: function, module: module} = __ENV__

        function =
          case function do
            {fun_name, arg_num} -> "#{fun_name}/#{arg_num}."
            nil -> ""
          end

        debug("Now we are at #{module}.#{function}", Mix.env())
      end
    end
  end
end