lib/event_store_dashboard/stream.ex

defmodule EventStoreDashboard.Stream do
  @moduledoc false

  @behaviour Access

  @type status :: :created | :deleted

  @type t :: %__MODULE__{
          stream_id: non_neg_integer() | nil,
          stream_uuid: String.t() | nil,
          stream_version: non_neg_integer() | nil,
          created_at: DateTime.t() | NaiveDateTime.t() | nil,
          deleted_at: DateTime.t() | NaiveDateTime.t() | nil,
          status: status() | nil
        }

  defstruct [
    :stream_id,
    :stream_uuid,
    :stream_version,
    :created_at,
    :deleted_at,
    :status
  ]

  @impl Access
  defdelegate fetch(struct, key), to: Map

  @impl Access
  defdelegate get_and_update(struct, key, fun), to: Map

  @impl Access
  defdelegate pop(struct, key), to: Map
end