lib/eventize/event_sourced_process/execution_pipeline.ex

defmodule Eventize.EventSourcedProcess.ExecutionPipeline do
  @moduledoc """
  The `Eventize.ExecutionPipeline` used to execute incoming
  messages to a process.
  """

  use Eventize.ExecutionPipeline,
    context: Eventize.EventSourcedProcess.ExecutionPipeline.ExecutionContext

  defmodule ExecutionContext do
    @moduledoc """
    The context used to execute a incoming message to a process.
    """

    @type t :: %__MODULE__{
            input: term(),
            build_response: (Eventize.EventSourcedProcessState.t() -> term()),
            state: Eventize.EventSourcedProcessState.t(),
            step_data: map(),
            type: :cast | :call,
            from: pid() | nil
          }

    @enforce_keys [:input, :build_response, :state, :type]

    defstruct [:input, :build_response, :state, :type, step_data: %{}, from: nil]
  end
end