defmodule MessageServer.ServerRegistry do use Agent @moduledoc """ Simple registry for server information using Agent for lightweight state management. """ @type server_info :: %{host: String.t(), port: integer()} @type servers_map :: %{String.t() => server_info()} @type state :: %{server_id: String.t(), servers: servers_map()} def start_link({server_id, servers, agent_name}) do Agent.start_link( fn -> %{server_id: server_id, servers: servers} end, name: agent_name ) end def start_link({server_id, servers}) do start_link({server_id, servers, __MODULE__}) end @spec get_server_id() :: String.t() def get_server_id(agent \\ __MODULE__) do Agent.get(agent, & &1.server_id) end @spec get_server_info(String.t()) :: {:ok, server_info()} | {:error, :not_found} def get_server_info(server_id, agent \\ __MODULE__) do Agent.get(agent, fn %{servers: servers} -> case Map.get(servers, server_id) do nil -> {:error, :not_found} info -> {:ok, info} end end) end @spec list_servers() :: servers_map() def list_servers(agent \\ __MODULE__) do Agent.get(agent, & &1.servers) end @spec get_local_server_info() :: %{id: String.t(), servers: servers_map()} def get_local_server_info(agent \\ __MODULE__) do Agent.get(agent, fn state -> %{id: state.server_id, servers: state.servers} end) end end