analytics/lib/plausible/helpers/config.ex

54 lines
1.4 KiB
Elixir

defmodule Plausible.ConfigHelpers do
def get_var_from_path_or_env(config_dir, var_name, default \\ nil) do
var_path = Path.join(config_dir, var_name)
if File.exists?(var_path) do
File.read!(var_path) |> String.trim()
else
System.get_env(var_name, default)
end
end
def get_int_from_path_or_env(config_dir, var_name, default \\ nil) do
var = get_var_from_path_or_env(config_dir, var_name)
case var do
nil ->
default
var ->
case Integer.parse(var) do
{int, ""} -> int
_ -> raise "Config variable #{var_name} must be an integer. Got #{var}"
end
end
end
def get_bool_from_path_or_env(config_dir, var_name, default \\ nil) do
case get_var_from_path_or_env(config_dir, var_name) do
nil -> default
var -> parse_bool(var)
end
end
@var_true ["1", "t", "true", "y", "yes", "on"]
@var_false ["0", "f", "false", "n", "no", "off"]
@var_bool_message Enum.zip_with(@var_true, @var_false, fn t, f -> [t, f] end)
|> List.flatten()
|> Enum.join(", ")
defp parse_bool(var) do
case String.downcase(var) do
t when t in @var_true ->
true
f when f in @var_false ->
false
_ ->
raise ArgumentError,
"Invalid boolean value: #{inspect(var)}. Expected one of: " <> @var_bool_message
end
end
end