bd85eccab5aaccafb4d0297f1fe9c49e7b2cd49f
[anni] / lib / pleroma / config / loader.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Config.Loader do
6   # These modules are only being used as keys here (for equality check),
7   # so it's okay to use `Module.concat/1` to have the compiler ignore them.
8   @reject_keys [
9     Module.concat(["Pleroma.Repo"]),
10     Module.concat(["Pleroma.Web.Endpoint"]),
11     :env,
12     :configurable_from_database,
13     :database,
14     :swarm
15   ]
16
17   @reject_groups [
18     :postgrex,
19     :tesla
20   ]
21
22   @reader Config.Reader
23
24   @spec read(Path.t()) :: keyword()
25   def read(path), do: @reader.read!(path)
26
27   @spec merge(keyword(), keyword()) :: keyword()
28   def merge(c1, c2), do: @reader.merge(c1, c2)
29
30   @spec default_config() :: keyword()
31   def default_config do
32     "config/config.exs"
33     |> read()
34     |> filter()
35   end
36
37   defp filter(configs) do
38     configs
39     |> Keyword.keys()
40     |> Enum.reduce([], &Keyword.put(&2, &1, filter_group(&1, configs)))
41   end
42
43   @spec filter_group(atom(), keyword()) :: keyword()
44   def filter_group(group, configs) do
45     Enum.reject(configs[group], fn {key, _v} ->
46       key in @reject_keys or group in @reject_groups or
47         (group == :phoenix and key == :serve_endpoints)
48     end)
49   end
50 end