lib/logger_sigil_l.ex

defmodule LoggerSigilL do
  @moduledoc """
    # LoggerSigilL

    ```LoggerSigilL``` provides a short syntax for logging while debugging an application, like ```~w(a b c)```

    ## Installation

    Add `logger_sigil_l` to your list of dependencies in `mix.exs`:

    ```elixir
    def deps do
      [
        {:logger_sigil_l,"~> 0.1.0"}
      ]
    end
    ```
    ## Use
    ```~l"your text here"<<<m>t>b>```
    ```elixir
    ~l"text" #default for Logger.debug
    ~l"text"i #default for Logger.info
    ~l"text"wr # Logger.warn with red text
    ~l"text"iry # Logger.info with red text and yellow background
    ```
    - **m** - Logger method ```i``` - info, ```d``` - debug, ```e``` - error, ```w``` - warn
    - **t** - text color
      - r - red
      - b - blue
      - g - green
      - w - white
      - m - magenta
      - c - cyan
      - d - black
      - y - yellow
    - **b** - background color - as text color
    ## Examples
    ```elixir
    #in our module
    use LoggerSigilL
    def test_logger do
      m = "test message"
        ~l"test message"
        ~l"test message"dr
        ~l"test message"er
        ~l"test message"ir
        ~l"test message"wr
        ~l"test message"dg
        ~l"test message"eg
        ~l"test message"ig
        ~l"test message"wg
        ~l"test message"dc
        ~l"test message"ec
        ~l"test message"ic
        ~l"test message"wc
        ~l"test message"dm
        ~l"test message"em
        ~l"test message"im
        ~l"test message"wm
        ~l"test message"dwm
        ~l"test message"ewm
        ~l"test message"iwm
        ~l"test message"wwm
        ~l"test message"dry
        ~l"test message"ery
        ~l"test message"iry
        ~l"test message"wry
        ~l"test message"dwb
        ~l"test message"ewb
        ~l"test message"iwb
        ~l"test message"wwb
    end
    ```

  """
  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