summaryrefslogtreecommitdiff
path: root/lib/pleroma/config/loader.ex
blob: 2a945999ed7730a067331f7661b1b63f6f841038 (plain)
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Config.Loader do
  # These modules are only being used as keys here (for equality check),
  # so it's okay to use `Module.concat/1` to have the compiler ignore them.
  @reject_keys [
    Module.concat(["Pleroma.Repo"]),
    Module.concat(["Pleroma.Web.Endpoint"]),
    :env,
    :configurable_from_database,
    :database,
    :swarm
  ]

  @reject_groups [
    :postgrex,
    :tesla
  ]

  if Code.ensure_loaded?(Config.Reader) do
    @reader Config.Reader

    def read(path), do: @reader.read!(path)
  else
    # support for Elixir less than 1.9
    @reader Mix.Config
    def read(path) do
      path
      |> @reader.eval!()
      |> elem(0)
    end
  end

  @spec read(Path.t()) :: keyword()

  @spec merge(keyword(), keyword()) :: keyword()
  def merge(c1, c2), do: @reader.merge(c1, c2)

  @spec default_config() :: keyword()
  def default_config do
    "config/config.exs"
    |> read()
    |> filter()
  end

  defp filter(configs) do
    configs
    |> Keyword.keys()
    |> Enum.reduce([], &Keyword.put(&2, &1, filter_group(&1, configs)))
  end

  @spec filter_group(atom(), keyword()) :: keyword()
  def filter_group(group, configs) do
    Enum.reject(configs[group], fn {key, _v} ->
      key in @reject_keys or group in @reject_groups or
        (group == :phoenix and key == :serve_endpoints)
    end)
  end
end