Current section

Files

Jump to
x3m_system lib service_registry implementation.ex
Raw

lib/service_registry/implementation.ex

defmodule X3m.System.ServiceRegistry.Implementation do
@moduledoc false
alias X3m.System.ServiceRegistry.State
@spec register_remote_services({node, [{atom, atom}]}, State.t()) :: {:ok, State.t()}
def register_remote_services(
{node, services},
%State{services: %State.Services{remote: remote_services}} = state
) do
services = %State.Services{
state.services
| remote: _register_remote_services(remote_services, services, node)
}
{:ok, %{state | services: services}}
end
@spec remove_remote_services(State.Services.remote_services(), node) ::
State.Services.remote_services()
def remove_remote_services(services, node) do
services
|> Enum.map(fn {service, nodes} ->
nodes =
nodes
|> Enum.reject(fn
{^node, _} -> true
_ -> false
end)
|> Enum.into(%{})
{service, nodes}
end)
|> Enum.reject(fn
{_, %{} = map} when map_size(map) == 0 -> true
_ -> false
end)
|> Enum.into(%{})
end
@spec _register_remote_services(State.Services.remote_services(), [{atom, atom}], node) ::
State.Services.remote_services()
defp _register_remote_services(existing_services, new_services, node) do
new_services
|> Enum.reduce(existing_services, fn {new_service, mod}, acc ->
acc
|> Map.put_new(new_service, %{})
|> put_in([new_service, node], mod)
end)
end
end