Packages
enux
0.3.0
1.6.0
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.2
1.4.1
1.4.0
1.3.3
1.3.2
1.3.1
1.3.0
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.3
1.1.2
1.1.1
1.1.0
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.14
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
utility package for loading, validating and documenting your app's configuration variables from env, json, jsonc and toml files at runtime and injecting them into your environment
Current section
Files
Jump to
Current section
Files
lib/enux.ex
defmodule Enux do
@moduledoc """
A module for reading variables from .env style configuration files and injecting them into your application.
In elixir 1.11, `config/runtime.exs` was introduced. This is a file that is executed exactly before your application starts.
This is a proper place to load any configuration variables into your app. If this file does not exist in your project directory,
create it and add these lines to it:
```
import Config
env = Enux.load()
config :otp_app, env
```
When you start your application, you can access your configuration variables using `Applicatoin.get_env`.
If you need to url encode your configuration values, just pass `url_encoded: true` to `Enux.load`.
"""
@doc """
reads the variables in `config/.env` and returns a formatted keyword list.
all values are loaded as they are.
"""
def load() do
File.stream!("config/.env", [], :line) |> pipeline([])
end
@doc """
reads the variables in `config/.env` and returns a formatted keyword list
"""
def load(opts) when is_list(opts) do
File.stream!("config/.env", [], :line) |> pipeline(opts)
end
@doc """
reads the variables in the given path and returns a formatted keyword list
"""
def load(path, opts \\ []) when is_binary(path) and is_list(opts) do
File.stream!(path, [], :line) |> pipeline(opts)
end
def pipeline(content, opts) do
content
|> Enum.filter(fn l -> String.trim(l) != "" end)
|> Enum.map(fn l ->
Regex.run(~r/(?<k>[A-Za-z0-9_\s]+)=(?<v>.*)/, l, capture: :all_but_first)
end)
|> Enum.map(fn l -> l |> Enum.map(fn i -> String.trim(i) end) end)
|> Enum.map(fn [k, v] ->
{k |> handle_number() |> String.to_atom(), v |> url_encode_conditional(opts)}
end)
end
defp url_encode_conditional(value, opts) when is_binary(value) and is_list(opts) do
case opts |> Keyword.get(:url_encoded, false) do
true -> value |> URI.encode()
false -> value
end
end
defp handle_number(key) when is_binary(key) do
case key |> String.first() |> Integer.parse() do
{_, ""} -> throw("#{key} starts with a digit")
:error -> key
end
end
end