lib/mdns_lite/info.ex

defmodule MdnsLite.Info do
  @moduledoc """
  Inspect internal MdnsLite state

  Functions in this module are intended for debugging mDNS issues.
  """

  alias MdnsLite.{Responder, TableServer}

  @doc """
  Dump the records that mDNSLite advertises
  """
  @spec dump_records() :: :ok
  def dump_records() do
    TableServer.get_records()
    |> format_rr([], "\n")
    |> IO.puts()
  end

  @doc """
  Dump the contents of the responder mDNS caches
  """
  @spec dump_caches() :: :ok
  def dump_caches() do
    Responder.get_all_caches()
    |> Enum.map(fn %{ifname: ifname, ip: ip, cache: cache} ->
      [
        "Responder (",
        :inet.ntoa(ip),
        "%",
        ifname,
        "):\n",
        format_rr(cache.records, "  ", "\n")
      ]
    end)
    |> IO.puts()
  end

  defp format_rr(rr, prefix, postfix) do
    rr
    |> Enum.sort()
    |> Enum.map(fn rec -> [prefix, MdnsLite.DNS.pretty(rec), postfix] end)
  end
end