lib/logger_sigil_l.ex

defmodule LoggerSigilL do
  @moduledoc false
  defmacro __using__(_) do
    first = quote do
      require Logger
      require LoggerSigilL
      import LoggerSigilL

      defp find_key(_list, nil, _default), do: nil
      defp find_key(list, key, default) when is_binary(key), do: find_key(list, String.to_atom(key), default)
      defp find_key(list, key, default), do: (if is_nil(Enum.find(list, fn {k,_} -> key == k end)), do: list[default], else: list[key])
      def log_(message, nil, nil) do
        Logger.debug(message)
      end
    end
    funs = ~w(debug info warn error)
    outs = Enum.map(funs, fn(fun) ->
      quote do
        require Logger
        import Logger
        def unquote(:"log_#{fun}")(message, nil, nil) do
          unquote(:"#{fun}")(message)
        end
        def unquote(:"log_#{fun}")(message, text, nil) do
          unquote(:"#{fun}")(message, ansi_color: [text])
        end
        def unquote(:"log_#{fun}")(message, text, back) do
          unquote(:"#{fun}")(message, ansi_color: [text, back])

        end

      end

    end)
    sig = quote do

      def sigil_l(m, opts) do
        table_fun = [
          d: :debug,
          i: :info,
          w: :warn,
          e: :error
        ]
        text_colors = [
          b: :blue,
          c: :cyan,
          w: :white,
          r: :red,
          g: :green,
          y: :yellow,
          d: :black,
          m: :magenta
        ]
        background_colors = [
          b: :blue_background,
          c: :cyan_background,
          w: :white_background,
          r: :red_background,
          g: :green_background,
          y: :yellow_background,
          d: :black_background,
          m: :magenta_background

        ]

        options = opts
        |> Enum.map( &to_string([&1]))

        {fun, text_color, background_color} = if length(options) > 0 do
          fun = find_key(table_fun, Enum.at(options, 0), :d)
          text_color = find_key(text_colors, Enum.at(options, 1), :c)
          background_color = find_key(background_colors, Enum.at(options, 2), :d)
          {fun, text_color, background_color}
        else
          {table_fun[:d], nil, nil}
        end


        apply(__MODULE__, :"log_#{fun}", [m, text_color, background_color])
      end
    end
    [first] ++ outs ++ [sig]
  end



end