summaryrefslogtreecommitdiff
path: root/lib/ejabberd/config/opts_formatter.ex
blob: 67887fa4f3cc63ba6f75798622c326a207c3647b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
defmodule Ejabberd.Config.OptsFormatter do
  @moduledoc """
  Module for formatting options parsed into the format
  ejabberd uses.
  """

  alias Ejabberd.Config.EjabberdModule

  @doc """
  Takes a keyword list with keys corresponding to
  the keys requested by the ejabberd config (ex: modules: mods)
  and formats them to be correctly evaluated by ejabberd.

  Look at how Config.get_ejabberd_opts/0 is constructed for
  more informations.
  """
  @spec format_opts_for_ejabberd([{atom(), any()}]) :: list()
  def format_opts_for_ejabberd(opts) do
    opts
    |> format_attrs_for_ejabberd
  end

  defp format_attrs_for_ejabberd(opts) when is_list(opts),
    do: (Enum.map opts, &format_attrs_for_ejabberd/1)

  defp format_attrs_for_ejabberd({:listeners, mods}),
    do: {:listen, format_listeners_for_ejabberd(mods)}

  defp format_attrs_for_ejabberd({:modules, mods}),
    do: {:modules, format_mods_for_ejabberd(mods)}

  defp format_attrs_for_ejabberd({key, opts}) when is_atom(key),
    do: {key, opts}

  defp format_mods_for_ejabberd(mods) do
    Enum.map mods, fn %EjabberdModule{module: mod, attrs: attrs} ->
      {mod, attrs[:opts]}
    end
  end

  defp format_listeners_for_ejabberd(mods) do
    Enum.map mods, fn %EjabberdModule{module: mod, attrs: attrs} ->
      Keyword.put(attrs[:opts], :module, mod)
    end
  end
end