Packages
ash_oban
0.8.1
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0-rc.1
0.8.0-rc.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.6
0.2.5
0.2.4
0.2.3
0.2.3-rc.1
0.2.3-rc.0
0.2.2
0.2.1
0.2.0
0.1.14
0.1.13
0.1.12
0.1.11
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
The extension for integrating Ash resources with Oban.
Current section
Files
Jump to
Current section
Files
lib/igniter.ex
# SPDX-FileCopyrightText: 2023 ash_oban contributors <https://github.com/ash-project/ash_oban/graphs/contributors>
#
# SPDX-License-Identifier: MIT
if Code.ensure_loaded?(Igniter) do
defmodule AshOban.Igniter do
@moduledoc "Codemods and utilities for resources that use `AshOban`."
@doc "Adds the given code block to the resource's `triggers` block if there is no existing trigger with the given name"
def add_new_trigger(igniter, resource, name, trigger) do
{igniter, defines?} = defines_trigger(igniter, resource, name)
if defines? do
igniter
else
add_trigger(igniter, resource, trigger)
end
end
@doc "Adds the given code block to the resource's `triggers` block"
def add_trigger(igniter, resource, trigger) do
Igniter.Project.Module.find_and_update_module!(igniter, resource, fn zipper ->
with {:oban, {:ok, zipper}} <-
{:oban,
Igniter.Code.Function.move_to_function_call_in_current_scope(
zipper,
:oban,
1
)},
{:oban, {:ok, oban_zipper}} <- {:oban, Igniter.Code.Common.move_to_do_block(zipper)},
{:triggers, oban_zipper, {:ok, zipper}} <-
{:triggers, oban_zipper,
Igniter.Code.Function.move_to_function_call_in_current_scope(
oban_zipper,
:triggers,
1
)},
{:triggers, _oban_zipper, {:ok, zipper}} <-
{:triggers, oban_zipper, Igniter.Code.Common.move_to_do_block(zipper)} do
{:ok, Igniter.Code.Common.add_code(zipper, trigger)}
else
{:oban, :error} ->
{:ok,
Igniter.Code.Common.add_code(zipper, """
oban do
triggers do
#{trigger}
end
end
""")}
{:triggers, oban_zipper, :error} ->
{:ok,
Igniter.Code.Common.add_code(oban_zipper, """
triggers do
#{trigger}
end
""")}
end
end)
end
@doc "Returns true if the given resource defines a trigger with the provided name"
@spec defines_trigger(Igniter.t(), Ash.Resource.t(), atom()) :: {Igniter.t(), true | false}
def defines_trigger(igniter, resource, name) do
Spark.Igniter.find(igniter, resource, fn _, zipper ->
with {:ok, zipper} <- enter_section(zipper, :oban),
{:ok, zipper} <- enter_section(zipper, :triggers),
{:ok, _zipper} <-
Igniter.Code.Function.move_to_function_call_in_current_scope(
zipper,
:trigger,
2,
&Igniter.Code.Function.argument_equals?(&1, 0, name)
) do
{:ok, true}
else
_ ->
:error
end
end)
|> case do
{:ok, igniter, _module, _value} ->
{igniter, true}
{:error, igniter} ->
{igniter, false}
end
end
defp enter_section(zipper, name) do
with {:ok, zipper} <-
Igniter.Code.Function.move_to_function_call_in_current_scope(
zipper,
name,
1
) do
Igniter.Code.Common.move_to_do_block(zipper)
end
end
end
end