defmodule ScaffoldCa.Utils.Injector do @spec inject_dependency(String.t(), String.t()) :: :ok | :already_injected | {:error, :unable_to_inject} def inject_dependency(file_path, dependency) do file_content = File.read!(file_path) with :ok <- ensure_not_already_injected(file_content, dependency), {:ok, new_file_content} <- do_mix_dependency_inject(file_content, dependency) do File.write!(file_path, new_file_content) end end @spec inject_dependency(String.t(), String.t(), String.t()) :: :ok | :already_injected | {:error, :unable_to_inject} def inject_dependency(file_content, file_path, dependency) do with :ok <- ensure_not_already_injected(file_content, dependency), {:ok, new_file_content} <- do_mix_dependency_inject(file_content, dependency) do File.write!(file_path, new_file_content) end end @spec do_mix_dependency_inject(String.t(), String.t()) :: {:ok, String.t()} | {:error, :unable_to_inject} defp do_mix_dependency_inject(mixfile, dependecy) do deps_header = """ defp deps do [ """ case String.split(mixfile, ~r{defp deps do(\s)+\[}) do [left, right] -> new_mixfile = "#{left}#{deps_header} #{dependecy},#{right}" {:ok, new_mixfile} [_] -> {:error, :unable_to_inject} end end @spec ensure_not_already_injected(String.t(), String.t()) :: :ok | :already_injected defp ensure_not_already_injected(file, inject) do if String.contains?(file, inject) do :already_injected else :ok end end end