Current section

Files

Jump to
project lib mix tasks project add oban_web.ex
Raw

lib/mix/tasks/project/add/oban_web.ex

defmodule Mix.Tasks.Project.Add.ObanWeb do
use Igniter.Mix.Task
alias Mix.Tasks.Project.Helpers
@impl Igniter.Mix.Task
def igniter(igniter) do
igniter
|> add_dep()
|> add_app_logger()
|> edit_formatter()
|> edit_router()
|> Igniter.add_task("project.gen.oban_web_format")
end
defp add_dep(igniter) do
{package, version} = Igniter.Project.Deps.determine_dep_type_and_version!("oban_web")
Igniter.Project.Deps.add_dep(igniter, {package, version})
end
defp add_app_logger(igniter) do
app_module = Helpers.app_module(igniter)
app_supervisor = Igniter.Project.Application.app_module(igniter)
pattern = "opts = [strategy: :one_for_one, name: #{app_module}.Supervisor]"
code = """
Oban.Web.Telemetry.attach_default_logger()
"""
Igniter.Project.Module.find_and_update_module!(igniter, app_supervisor, fn zipper ->
case Sourceror.Zipper.search_pattern(zipper, pattern) do
nil -> Igniter.Code.Common.add_code(zipper, code, placement: :after)
found -> {:ok, Igniter.Code.Common.add_code(found, code, placement: :before)}
end
end)
end
defp edit_formatter(igniter) do
Igniter.Project.Formatter.import_dep(igniter, :oban_web)
end
defp edit_router(igniter) do
{igniter, router} = Igniter.Libs.Phoenix.select_router(igniter)
igniter
|> add_router_import(router)
|> Igniter.Libs.Phoenix.add_scope("/admin", """
pipe_through :browser
oban_dashboard "/oban"
""", router: router)
end
defp add_router_import(igniter, router) do
code = "import Oban.Web.Router"
Igniter.Project.Module.find_and_update_module!(igniter, router, fn zipper ->
case Igniter.Libs.Phoenix.move_to_router_use(igniter, zipper) do
{:ok, zipper} -> {:ok, Igniter.Code.Common.add_code(zipper, code)}
:error -> Igniter.Code.Common.add_code(zipper, code, placement: :after)
end
end)
end
end