lib/navigator/link_config.ex

defmodule Navigator.LinkConfig do
  @type link :: Navigator.Link.t()
  @type app_name :: atom
  @type app_links :: %{
          optional(app_name) => [link]
        }

  @spec parse(map) :: {:ok, app_links}
  def parse(app_config_links \\ Application.get_env(:navigator, :links, %{})) do
    apps =
      app_config_links
      |> Enum.reduce(
        %{},
        fn {app_name, app_attrs}, acc ->
          app_links =
            app_attrs
            |> Enum.map(fn link_attrs ->
              struct!(Navigator.Link, link_attrs)
            end)

          Map.put(acc, app_name, app_links)
        end
      )

    {:ok, apps}
  end
end