Current section
Files
Jump to
Current section
Files
lib/env_config.ex
# 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