lib/step_flow/repo.ex

defmodule StepFlow.Repo do
  use Ecto.Repo,
    otp_app: :step_flow,
    show_sensitive_data_on_connection_error: true,
    adapter: Ecto.Adapters.Postgres

  require Logger

  def init(_, opts) do
    opts =
      opts
      |> replace_if_present(:hostname)
      |> replace_if_present(:port)
      |> replace_if_present(:username)
      |> replace_if_present(:password)
      |> replace_if_present(:database)
      |> replace_if_present(:runtime_pool_size, :pool_size, &StepFlow.Configuration.to_integer/1)

    Logger.debug("StepFlow connecting to Postgres with parameters: #{inspect(opts)}")
    {:ok, opts}
  end

  defp replace_if_present(opts, key, output_key \\ nil, processor \\ &StepFlow.Repo.bypass/1) do
    case StepFlow.Configuration.get_var_value(StepFlow.Repo, key) do
      nil ->
        opts

      value ->
        value = processor.(value)

        output_key =
          if output_key == nil do
            key
          else
            output_key
          end

        Keyword.put(opts, output_key, value)
    end
  end

  def bypass(value), do: value
end