Current section

Files

Jump to
dotenv_config src dotenv_config.erl
Raw

src/dotenv_config.erl

-module(dotenv_config).
-include("dotenv_config.hrl").
-export([init/1, init/2, stop/0, get/1, fetch/1, set/2, get_all/0]).
-export_type([config_item_name/0, config_item_value/0, parser/0, parsed_config/0]).
-ignore_xref({init, 1}).
-ignore_xref({init, 2}).
-ignore_xref({stop, 0}).
-ignore_xref({get, 1}).
-ignore_xref({fetch, 1}).
-ignore_xref({set, 2}).
-ignore_xref({get_all, 0}).
%%------------------------------------------------------------------------------
%% @doc init/2
%% Load configuration from environment variables and store it in the persistent term storage.
%%
%% You can set DOTENV_CONFIG_ENV_FILES environment variable to list of files to load
%% configuration from (comma separated).
%%
%% Environment variables have higher priority than .env files.
%%
%% Parameters:
%% Module - module which will be used to parse the configuration (see readme for details)
%% Returns:
%% ok - if configuration was successfully loaded and stored
%% {error, Reason} - if there was an error during loading or storing
%% @end
%%------------------------------------------------------------------------------
-spec init(module()) -> ok.
init(Module) ->
EnvFiles =
case os:getenv("DOTENV_CONFIG_ENV_FILES") of
false -> [];
EnvFilesStr -> string:tokens(EnvFilesStr, ",")
end,
init(Module, EnvFiles).
%%------------------------------------------------------------------------------
%% @doc init/2
%% Load configuration from .env files and override it by environment variables
%% (if duplicate last read place wins) and store it in the persistent term storage.
%% Parameters:
%% Module - module which will be used to parse the configuration (see readme for details)
%% FileNames - list of names of the files to load configuration from
%% Returns:
%% ok - if configuration was successfully loaded and stored
%% {error, Reason} - if there was an error during loading or storing
%% @end
%%------------------------------------------------------------------------------
-spec init(module(), [file:name_all()]) -> ok.
init(Module, FileNames) ->
Config = lists:foldl(
fun(FileName, ConfigAcc) ->
case dotenv_config_parser:parse_file(FileName) of
{ok, Config} ->
maps:merge(ConfigAcc, Config);
{error, Reason} ->
BinReason = dotenv_config_error:to_binary(Reason),
BinFileName = dotenv_config_error:to_binary(FileName),
exit(<<"Can't read file ", BinFileName/binary, ": ", BinReason/binary>>)
end
end,
#{},
FileNames
),
{ok, ParsedConfig} = dotenv_config_parser:parse_config(Config, Module),
dotenv_config_storage:store(ParsedConfig).
%%------------------------------------------------------------------------------
%% @doc get/1
%% Get configuration item from the persistent term storage. But if it's not found
%% raise an exception.
%% @end
%%------------------------------------------------------------------------------
-spec get(config_item_name()) -> config_item_value().
get(ConfigItemName) ->
case dotenv_config_storage:get(ConfigItemName) of
{ok, ConfigItemValue} ->
ConfigItemValue;
{error, not_found} ->
error({config_item_not_found, ConfigItemName})
end.
%%------------------------------------------------------------------------------
%% @doc fetch/1
%% Get configuration item from the persistent term storage.
%% @end
%%------------------------------------------------------------------------------
-spec fetch(config_item_name()) -> {ok, config_item_value()} | {error, not_found}.
fetch(ConfigItemName) ->
dotenv_config_storage:get(ConfigItemName).
%%------------------------------------------------------------------------------
%% @doc set/2
%% Set configuration item in the persistent term storage.
%% @end
%%------------------------------------------------------------------------------
-spec set(config_item_name(), config_item_value()) -> ok.
set(ConfigItemName, ConfigItemValue) ->
dotenv_config_storage:set(ConfigItemName, ConfigItemValue).
%%------------------------------------------------------------------------------
%% @doc get_all/0
%% Get all configuration items from the persistent term storage.
%% @end
%%------------------------------------------------------------------------------
-spec get_all() -> parsed_config().
get_all() ->
dotenv_config_storage:get_all().
%%------------------------------------------------------------------------------
%% @doc stop/0
%% Stop config storage and delete all stored configuration.
%% @end
%%------------------------------------------------------------------------------
-spec stop() -> ok.
stop() ->
dotenv_config_storage:clean().