defmodule Mix.Tasks.Ecto.Setup.Arango do @moduledoc """ Sets up all necessary aspects of the adapter Adds migrations collection in _systems db for migrations and creates the database """ use Mix.Task alias Mix.ArangoXEcto, as: Helpers @impl true def run(_args) do Mix.Task.run("app.start") Mix.shell().info("\n=====[ Running ArangoXEcto Setup ]=====") Helpers.create_base_database() |> process_response( {&"1 >> Created database `#{&1}`", "1 >> Database already exists", &"1 >> Error creating database, returned Arango API status `#{&1}`"}, &Helpers.create_migrations/0 ) |> process_response( {"2 >> Created migrations collection in system database", "2 >> System database already has migrations collection", &"2 >> Error creating migrations collection, returned Arango API status `#{&1}`"}, &Helpers.create_migration_document/0 ) |> process_response( {"3 >> Created migation document. \nSetup Complete", "3 >> Migrations collection already contains database document", &"3 >> Error creating migration database document, returned Arango API status `#{&1}`"}, nil ) end defp process_response(:fail, _, _), do: :fail defp process_response(response, {success_msg, exists_msg, error_msg}, success_func) do case response do {:ok, pass_arg} -> build_msg(success_msg, pass_arg) |> Mix.shell().info() maybe_run_success_func(success_func) :ok -> build_msg(success_msg) |> Mix.shell().info() maybe_run_success_func(success_func) {:error, 409} -> build_msg(exists_msg) |> Mix.shell().info() maybe_run_success_func(success_func) {:error, status} -> build_msg(error_msg, status) |> Mix.shell().error() :fail end end defp maybe_run_success_func(func) when is_function(func) and not is_nil(func), do: func.() defp maybe_run_success_func(_), do: :ok defp build_msg(func, args \\ []) defp build_msg(func, arg) when not is_list(arg), do: build_msg(func, [arg]) defp build_msg(func, args) when is_function(func), do: apply(func, args) defp build_msg(msg, _), do: msg end