Current section
Files
Jump to
Current section
Files
lib/double/registry.ex
defmodule Double.Registry do
@moduledoc false
use GenServer
# API
def start_link do
GenServer.start_link(__MODULE__, nil, name: :registry)
end
def start do
GenServer.start(__MODULE__, nil, name: :registry)
end
def whereis_double(double_id) do
GenServer.call(:registry, {:whereis_double, double_id})
end
def whereis_test(double_id) do
GenServer.call(:registry, {:whereis_test, double_id})
end
def source_for(double_id) do
GenServer.call(:registry, {:source_for, double_id})
end
def opts_for(double_id) do
GenServer.call(:registry, {:opts_for, double_id})
end
def register_double(double_id, pid, test_pid, source, opts) do
arg = {:register_id, double_id, pid, test_pid, source, opts}
GenServer.call(:registry, arg)
end
# SERVER
def init(_) do
{:ok, Map.new()}
end
def handle_call({:whereis_double, double_id}, _from, state) do
{double_pid, _, _, _} =
state
|> Map.get(double_id, {:undefined, nil, nil, nil})
{:reply, double_pid, state}
end
def handle_call({:whereis_test, double_id}, _from, state) do
{_, test_pid, _, _} = Map.get(state, double_id, {:undefined, nil, nil, nil})
{:reply, test_pid, state}
end
def handle_call({:source_for, double_id}, _from, state) do
{_, _, source, _} = Map.get(state, double_id, {:undefined, nil, nil, nil})
{:reply, source, state}
end
def handle_call({:opts_for, double_id}, _from, state) do
{_, _, _, opts} = Map.get(state, double_id, {:undefined, nil, nil, nil})
{:reply, opts, state}
end
def handle_call({:register_id, double_id, pid, test_pid, source, opts}, _from, state) do
case Map.get(state, double_id) do
nil ->
{:reply, :yes, Map.put(state, double_id, {pid, test_pid, source, opts})}
_ ->
{:reply, :no, state}
end
end
end