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