defmodule EventStoreDashboard.Params do @moduledoc false alias Phoenix.LiveDashboard.PageBuilder defstruct [ :eventstore, :nav, :stream, :stream_modal, :event, :streams_page, :events_page, :subscriptions_page, :snapshots_page, :subscription_id, :snapshot_uuid, :correlation_id, :causation_id, :event_type ] @type t :: %__MODULE__{ eventstore: String.t() | module() | {module(), keyword()} | nil, nav: String.t() | nil, stream: String.t() | nil, stream_modal: String.t() | nil, event: integer() | nil, streams_page: pos_integer() | nil, events_page: pos_integer() | nil, subscriptions_page: pos_integer() | nil, snapshots_page: pos_integer() | nil, subscription_id: integer() | nil, snapshot_uuid: String.t() | nil, correlation_id: String.t() | nil, causation_id: String.t() | nil, event_type: String.t() | nil } @nav_tabs ~w(streams events subscriptions snapshots) @spec from_url(map()) :: t() def from_url(params) when is_map(params) do %__MODULE__{ eventstore: parse_string(params, "eventstore"), nav: parse_nav(params), stream: parse_stream(params), stream_modal: parse_string(params, "stream_modal"), event: parse_integer(params, "event"), streams_page: parse_page(params, "streams_page"), events_page: parse_page(params, "events_page"), subscriptions_page: parse_page(params, "subscriptions_page"), snapshots_page: parse_page(params, "snapshots_page"), subscription_id: parse_integer(params, "subscription_id"), snapshot_uuid: parse_string(params, "snapshot_uuid"), correlation_id: parse_string(params, "correlation_id"), causation_id: parse_string(params, "causation_id"), event_type: parse_string(params, "event_type") } end @spec to_live_dashboard_path(Phoenix.LiveView.Socket.t(), map(), t()) :: String.t() def to_live_dashboard_path(socket, page, %__MODULE__{} = params) do keyword = params |> Map.from_struct() |> Map.update!(:eventstore, &eventstore_param/1) |> Enum.to_list() PageBuilder.live_dashboard_path(socket, page, keyword) end @spec eventstore_param(String.t() | module() | {module(), keyword()} | nil) :: String.t() | nil def eventstore_param(nil), do: nil def eventstore_param({module, _opts}) when is_atom(module), do: inspect(module) def eventstore_param(module) when is_atom(module), do: inspect(module) def eventstore_param(value) when is_binary(value), do: value defp parse_string(params, key), do: string(Map.get(params, key)) defp string(""), do: nil defp string(value) when is_binary(value), do: value defp string(_), do: nil defp parse_integer(params, key), do: integer(Map.get(params, key)) defp integer(value) when is_binary(value), do: integer_parsed(Integer.parse(value)) defp integer(_), do: nil defp integer_parsed({n, ""}), do: n defp integer_parsed(_), do: nil defp parse_page(params, key), do: page(parse_integer(params, key)) defp page(n) when is_integer(n) and n >= 1, do: n defp page(_), do: nil defp parse_nav(%{"nav" => value}) when value in @nav_tabs, do: value defp parse_nav(_), do: nil defp parse_stream(%{"stream" => ""}), do: "$all" defp parse_stream(%{"stream" => value}) when is_binary(value), do: value defp parse_stream(_), do: "$all" end