defmodule BorderGuard do @moduledoc """ Documentation for `BorderGuard`. """ use GenServer @default_opts [ latency: 0, response: :ok, request_error_response: :error, force_error: false ] def init(opts) do {:ok, opts} end def start_link(opts \\ []) do GenServer.start_link(__MODULE__, get_defaults(opts)) end defmacro handle(name, request_opts \\ [], do: request) do if Application.get_env(:border_guard, :enabled) do # Fetch or spawn handler process for module BorderGuard.Supervisor |> DynamicSupervisor.start_child({BorderGuard.Handler, get_handler_opts(name)}) |> return_pid() |> GenServer.call(request_opts, :infinity) else quote do # TODO: Add logging # {time_in_microseconds, ret_val} = :timer.tc(fn -> unquote(request) end) # IO.inspect(time_in_microseconds, label: "time_in_microseconds") # ret_val unquote(request) end end end defp get_defaults(opts) do @default_opts |> Keyword.merge(Application.get_env(:border_guard, :defaults, [])) |> Keyword.merge(opts) end defp get_handler_opts(name) do Application.get_env(:border_guard, name, []) |> get_defaults() |> Keyword.merge(name: name) end defp return_pid({:ok, pid}), do: pid defp return_pid({:error, {:already_started, pid}}), do: pid end