# Copied from https://gist.githubusercontent.com/bitwalker/a4f73b33aea43951fe19b242d06da7b9/raw/eca0f6fa7b840a4ef3c9719423d72e3ae370dd9d/config.ex defmodule EnvConfig do @moduledoc """ This module handles fetching values from the config with some additional niceties """ @doc """ Fetches a value from the config, or from the environment if {:system, "VAR"} is provided. An optional default value can be provided if desired. ## Example iex> {test_var, expected_value} = System.get_env |> Enum.take(1) |> List.first ...> Application.put_env(:myapp, :test_var, {:system, test_var}) ...> ^expected_value = #{__MODULE__}.get(:myapp, :test_var) ...> :ok :ok iex> Application.put_env(:myapp, :test_var2, 1) ...> 1 = #{__MODULE__}.get(:myapp, :test_var2) 1 iex> :default = #{__MODULE__}.get(:myapp, :missing_var, :default) :default """ @spec get(atom, atom, term | nil) :: term def get(app, key, default \\ nil) when is_atom(app) and is_atom(key) do case Application.get_env(app, key) do {:system, env_var} -> case System.get_env(env_var) do nil -> default val -> val end {:system, env_var, preconfigured_default} -> case System.get_env(env_var) do nil -> preconfigured_default val -> val end nil -> default val -> val end end @doc """ Same as get/3, but raises an error if the key is not found. """ def get!(app, key), do: get(app, key, :error) |> ok!(key) @doc """ Same as get/3, but returns the result as an integer. If the value cannot be converted to an integer, the default is returned instead. """ @spec get_integer(atom(), atom(), integer() | nil | :error) :: integer def get_integer(app, key, default \\ nil) do case get(app, key, nil) do nil -> default n when is_integer(n) -> n n -> case Integer.parse(n) do {i, _} -> i :error -> default end end end @doc """ Same as get_integer/3, but raises an error if the key is not found """ def get_integer!(app, key), do: get_integer(app, key, :error) |> ok!(key) defp ok!(:error, key), do: raise "Required key :#{key} not found" defp ok!(v, _), do: v end