lib/runbox/run_start_context.ex

defmodule Runbox.RunStartContext do
  @moduledoc """
  Structure holding context of starting run.

  This structure is passed as param to every run component start.
  """

  defstruct components_pids: %{}

  @typedoc """
  Currently context holds only mapping of names to pids of already started components.
  """
  @type t :: %__MODULE__{components_pids: %{term => pid}}

  @doc """
  Adds pid of component identified by `name` to context.
  """
  @spec add_component(t, term, pid) :: t
  def add_component(ctx, name, pid) do
    %__MODULE__{ctx | components_pids: Map.put(ctx.components_pids, name, pid)}
  end

  @doc """
  Returns pid of component identitfied by `name`.
  """
  @spec component_pid(t, term) :: pid
  def component_pid(ctx, name) do
    Map.fetch!(ctx.components_pids, name)
  end
end