mirror of
https://github.com/ash-project/ash_postgres.git
synced 2024-09-20 21:43:12 +12:00
106 lines
3.1 KiB
Elixir
106 lines
3.1 KiB
Elixir
|
defmodule Mix.Tasks.AshPostgres.Install do
|
||
|
require Igniter.Common
|
||
|
use Igniter.Mix.Task
|
||
|
|
||
|
def igniter(igniter, argv) do
|
||
|
repo = Igniter.Module.module_name("Repo")
|
||
|
otp_app = Igniter.Application.app_name()
|
||
|
|
||
|
igniter
|
||
|
|> Igniter.Formatter.import_dep(:ash_postgres)
|
||
|
|> setup_repo_module(otp_app, repo)
|
||
|
|> Igniter.Config.configure("config.exs", :ash_postgres, [repo, :username], "postgres")
|
||
|
end
|
||
|
|
||
|
defp setup_repo_module(igniter, otp_app, repo) do
|
||
|
path = Igniter.Module.proper_location(repo)
|
||
|
|
||
|
default_repo_contents =
|
||
|
"""
|
||
|
defmodule #{inspect(repo)} do
|
||
|
use AshPostgres.Repo, otp_app: #{inspect(otp_app)}
|
||
|
|
||
|
def installed_extensions do
|
||
|
# Add extensions here, and the migration generator will install them.
|
||
|
["ash-functions"]
|
||
|
end
|
||
|
end
|
||
|
"""
|
||
|
|
||
|
igniter
|
||
|
|> Igniter.create_or_update_elixir_file(path, default_repo_contents, fn zipper ->
|
||
|
zipper
|
||
|
|> set_otp_app(otp_app)
|
||
|
|> Sourceror.Zipper.top()
|
||
|
|> use_ash_postgres_instead_of_ecto()
|
||
|
|> Sourceror.Zipper.top()
|
||
|
|> add_installed_extensions_function()
|
||
|
|> Sourceror.Zipper.top()
|
||
|
|> remove_adapter_option()
|
||
|
end)
|
||
|
|> Igniter.add_task("ash.codegen")
|
||
|
end
|
||
|
|
||
|
defp use_ash_postgres_instead_of_ecto(zipper) do
|
||
|
with {:ok, zipper} <- Igniter.Common.move_to_module_using(zipper, Ecto.Repo),
|
||
|
{:ok, zipper} <- Igniter.Common.move_to_use(zipper, Ecto.Repo),
|
||
|
{:ok, zipper} <-
|
||
|
Igniter.Common.update_nth_argument(zipper, 0, fn _ ->
|
||
|
AshPostgres.Repo
|
||
|
end) do
|
||
|
zipper
|
||
|
else
|
||
|
_ ->
|
||
|
zipper
|
||
|
end
|
||
|
end
|
||
|
|
||
|
defp remove_adapter_option(zipper) do
|
||
|
with {:ok, zipper} <- Igniter.Common.move_to_module_using(zipper, Ecto.Repo),
|
||
|
{:ok, zipper} <- Igniter.Common.move_to_use(zipper, Ecto.Repo),
|
||
|
{:ok, zipper} <-
|
||
|
Igniter.Common.update_nth_argument(zipper, 1, fn values_zipper ->
|
||
|
values_zipper
|
||
|
|> Igniter.Common.remove_keyword_key(:adapter)
|
||
|
end) do
|
||
|
zipper
|
||
|
else
|
||
|
_ ->
|
||
|
zipper
|
||
|
end
|
||
|
end
|
||
|
|
||
|
defp set_otp_app(zipper, otp_app) do
|
||
|
with {:ok, zipper} <- Igniter.Common.move_to_module_using(zipper, Ecto.Repo),
|
||
|
{:ok, zipper} <- Igniter.Common.move_to_use(zipper, Ecto.Repo),
|
||
|
{:ok, zipper} <-
|
||
|
Igniter.Common.update_nth_argument(zipper, 0, fn _ ->
|
||
|
AshPostgres.Repo
|
||
|
end),
|
||
|
{:ok, zipper} <-
|
||
|
Igniter.Common.update_nth_argument(zipper, 1, fn values_zipper ->
|
||
|
values_zipper
|
||
|
|> Igniter.Common.set_keyword_key(:otp_app, otp_app, fn x -> x end)
|
||
|
end) do
|
||
|
zipper
|
||
|
else
|
||
|
_ ->
|
||
|
zipper
|
||
|
end
|
||
|
end
|
||
|
|
||
|
defp add_installed_extensions_function(zipper) do
|
||
|
with {:ok, zipper} <- Igniter.Common.move_to_module_using(zipper, Ecto.Repo) do
|
||
|
Igniter.Common.add_code(zipper, """
|
||
|
def installed_extensions do
|
||
|
# Add extensions here, and the migration generator will install them.
|
||
|
["ash-functions"]
|
||
|
end
|
||
|
""")
|
||
|
else
|
||
|
_ ->
|
||
|
zipper
|
||
|
end
|
||
|
end
|
||
|
end
|