defmodule Reactor.Req.Step do @moduledoc """ A step which delegates to `req`. """ use Reactor.Step @doc false @impl true @spec run(Reactor.inputs(), Reactor.context(), keyword) :: {:ok | :error, any} def run(arguments, _context, options) do fun = Keyword.fetch!(options, :fun) arguments = arguments |> Enum.reject(&is_nil(elem(&1, 1))) do_run(arguments, fun) end defp do_run(arguments, :delete) do {request, options} = Keyword.pop(arguments, :request) if request do Req.delete(request, options) else Req.delete(options) end end defp do_run(arguments, :get) do {request, options} = Keyword.pop(arguments, :request) if request do Req.get(request, options) else Req.get(options) end end defp do_run(arguments, :head) do {request, options} = Keyword.pop(arguments, :request) if request do Req.head(request, options) else Req.head(options) end end defp do_run(arguments, :merge) do {request, options} = Keyword.pop(arguments, :request) {:ok, Req.merge(request, options)} end defp do_run(arguments, :new) do options = Keyword.delete(arguments, :request) {:ok, Req.new(options)} end defp do_run(arguments, :patch) do {request, options} = Keyword.pop(arguments, :request) if request do Req.patch(request, options) else Req.patch(options) end end defp do_run(arguments, :post) do {request, options} = Keyword.pop(arguments, :request) if request do Req.post(request, options) else Req.post(options) end end defp do_run(arguments, :put) do {request, options} = Keyword.pop(arguments, :request) if request do Req.put(request, options) else Req.put(options) end end defp do_run(arguments, :request) do {request, options} = Keyword.pop(arguments, :request) Req.request(request, options) end defp do_run(arguments, :run) do {request, options} = Keyword.pop(arguments, :request) {:ok, Req.run(request, options)} end end