defmodule ExSecrets.Providers.DotEnv do use ExSecrets.Providers.Base alias ExSecrets.Cache alias ExSecrets.Utils.Config def get(key) do case GenServer.whereis(process_name()) do pid when is_pid(pid) -> Cache.get(key) _ -> get_scripted(key) end end def init(_) do read_env() {:ok, %{}} end def reset() do read_env() :ok end defp read_env() do path = Config.provider_config_value(:dot_env, :path) with {:ok, s} <- File.read(path), [_ | _] = envs <- String.split(s, ~r{(\r\n|\r|\n|\\n)}, trim: true) do Enum.each(envs, &put_env/1) else _ -> raise(raise(ExSecrets.Exceptions.InvalidConfiguration, ".env is not found")) end end defp get_scripted(key) do path = Config.provider_config_value(:dot_env, :path) with {:ok, s} <- File.read(path), [_ | _] = envs <- String.split(s, ~r{(\r\n|\r|\n|\\n)}, trim: true) do Enum.find(envs, &(get_k_v(&1) |> is_value(key))) |> get_v() else _ -> raise(raise(ExSecrets.Exceptions.InvalidConfiguration, ".env is not found")) end end defp put_env(s) do {k, v} = get_k_v(s) Cache.save(k, v) end defp get_v(s) do {_k, v} = get_k_v(s) v end defp get_k_v(s) do [k | rest] = String.split(s, "=") v = Enum.join(rest, "=") {k, v} end defp is_value({k, _v}, key), do: k == key def process_name() do :ex_secrets_dot_env end end