defmodule Prymn.Agents.Store do @moduledoc false use Agent alias Prymn.Agents # Stores and serves locally saved "Prymn Agents" to the application # Not to be confused with the "Prymn Server" construct @doc false def start_link([]) do Agent.start_link(fn -> %{} end, name: __MODULE__) end def get(id) do Agent.get(__MODULE__, fn agents -> agents[id] end) end def get_or_default(id, new_agent \\ nil) do case Agent.get(__MODULE__, fn agents -> agents[id] end) do nil -> agent = new_agent || Agents.Agent.new(id) Agent.update(__MODULE__, &Map.put(&1, id, agent)) agent agent -> agent end end def update_health(id, health) do case get(id) do nil -> agent = %Agents.Agent{Agents.Agent.new(id) | status: :connected, health: health} Agent.update(__MODULE__, &Map.put(&1, id, agent)) agent agent -> agent = %Agents.Agent{agent | status: :connected, health: health} Agent.update(__MODULE__, &Map.put(&1, id, agent)) agent end end end