defmodule Mix.Tasks.Cairnloop.Retrieval.ReplayFailed do
use Mix.Task
@shortdoc "Replay failed retrieval jobs through the retrieval context"
@moduledoc """
Replay failed retrieval jobs through `Cairnloop.Retrieval`.
Examples:
mix cairnloop.retrieval.replay_failed --queue default
mix cairnloop.retrieval.replay_failed --queue default --worker Cairnloop.KnowledgeBase.Workers.ChunkRevision
"""
@switches [queue: :string, worker: :string]
@impl Mix.Task
def run(args) do
{opts, _, _} = OptionParser.parse(args, strict: @switches)
replay_opts =
[]
|> Keyword.put(:queue, Keyword.get(opts, :queue, "default"))
|> maybe_put_worker(Keyword.get(opts, :worker))
case retrieval_module().replay_failed(replay_opts) do
{:ok, jobs} ->
Mix.shell().info("Replayed #{length(jobs)} retrieval job(s)")
{:error, reason} ->
Mix.raise("Retrieval replay failed: #{inspect(reason)}")
end
end
defp maybe_put_worker(opts, nil), do: opts
defp maybe_put_worker(opts, worker), do: Keyword.put(opts, :worker, worker)
defp retrieval_module do
Application.get_env(:cairnloop, :retrieval_module, Cairnloop.Retrieval)
end
end