# Pleroma: A lightweight social networking server # Copyright © 2017-2021 Pleroma Authors # 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