Packages
border_guard
0.1.0
BorderGuard is a library for handling requests with a configurable delay and success/error response.
Current section
Files
Jump to
Current section
Files
lib/border_guard.ex
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