diff --git a/lib/trinity/sim_server.ex b/lib/trinity/sim_server.ex index 7a451f5..f50446d 100644 --- a/lib/trinity/sim_server.ex +++ b/lib/trinity/sim_server.ex @@ -31,6 +31,7 @@ defmodule Trinity.SimServer do end end + @spec receive_response(request_id, timeout) :: {:reply, term} | {:error, term} | :timeout def receive_response(request_id, timeout) do case get_sim() do nil -> :gen_server.receive_response(request_id, timeout) @@ -38,6 +39,22 @@ defmodule Trinity.SimServer do end end + @spec cast(GenServer.server, term) :: :ok + def cast(server, request) do + case get_sim() do + nil -> GenServer.cast(server, request) + _sim -> sim_cast(server, request) + end + end + + @spec reply(term, term) :: :ok + def reply(client, reply) do + case get_sim() do + nil -> GenServer.reply(client, reply) + _sim -> sim_reply(client, reply) + end + end + defp sim_call(server, request, timeout) do req_id = send_request(server, request) case receive_response(req_id, timeout) do @@ -66,11 +83,14 @@ defmodule Trinity.SimServer do result end - @spec cast(GenServer.server, term) :: :ok - def cast(server, request) do - case get_sim() do - nil -> GenServer.cast(server, request) - _sim -> :noop - end + defp sim_cast(server, request) do + SimProcess.send server, {:"$sim_cast", request} + :ok + end + + defp sim_reply(client, reply) do + {_pid, [:alias | alias] = tag} = client + SimProcess.send alias, {tag, reply} + :ok end end