defmodule Phoenix.LiveDashboard.EtsInfoComponent do use Phoenix.LiveDashboard.Web, :live_component alias Phoenix.LiveDashboard.SystemInfo @info_keys [ :id, :name, :size, :node, :named_table, :read_concurrency, :write_concurrency, :compressed, :memory, :owner, :heir, :type, :keypos, :protection ] @impl true def render(assigns) do ~H"""
<%= if @alive do %> <:elem label="ID"><%= @id %> <:elem label="Name"><%= @name %> <:elem label="Size"><%= @size %> <:elem label="Node"><%= @node %> <:elem label="Named table"><%= @named_table %> <:elem label="Read concurrency"><%= @read_concurrency %> <:elem label="Write concurrency"><%= @write_concurrency %> <:elem label="Compressed"><%= @compressed %> <:elem label="Memory"><%= @memory %> <:elem label="Owner"><%= @owner %> <:elem label="Heir"><%= @heir %> <:elem label="Type"><%= @type %> <:elem label="Keypos"><%= @keypos %> <:elem label="Protection"><%= @protection %> <% else %>
ETS does not exist.
<% end %>
""" end @impl true def mount(socket) do {:ok, Enum.reduce(@info_keys, socket, &assign(&2, &1, nil))} end @impl true def update(%{id: "ETS" <> ref, path: path, page: page}, socket) do ref = :erlang.list_to_ref(String.to_charlist("#Ref" <> ref)) {:ok, socket |> assign(ref: ref, path: path, node: page.node) |> assign_info()} end defp assign_info(%{assigns: assigns} = socket) do case SystemInfo.fetch_ets_info(socket.assigns.node, assigns.ref) do {:ok, info} -> Enum.reduce(info, socket, fn {key, val}, acc -> assign(acc, key, format_info(key, val, assigns.path)) end) |> assign(alive: true) :error -> assign(socket, alive: false) end end defp format_info(:memory, val, _live_dashboard_path), do: format_words(val) defp format_info(_key, val, live_dashboard_path), do: format_value(val, live_dashboard_path) end