Skip to main content

lib/jido/chat/concurrency.ex

defmodule Jido.Chat.Concurrency do
  @moduledoc """
  Chat-level overlapping-message concurrency configuration.
  """

  @strategies [:reject, :queue, :debounce, :concurrent]

  @schema Zoi.struct(
            __MODULE__,
            %{
              strategy: Zoi.enum(@strategies) |> Zoi.default(:reject),
              metadata: Zoi.map() |> Zoi.default(%{})
            },
            coerce: true
          )

  @type strategy :: :reject | :queue | :debounce | :concurrent
  @type t :: unquote(Zoi.type_spec(@schema))
  @type pending_entry :: %{owner: String.t(), strategy: strategy(), metadata: map()}

  @enforce_keys Zoi.Struct.enforce_keys(@schema)
  defstruct Zoi.Struct.struct_fields(@schema)

  @doc "Returns the schema for concurrency configuration."
  def schema, do: @schema

  @doc "Creates a normalized concurrency config."
  @spec new(t() | map() | keyword()) :: t()
  def new(%__MODULE__{} = config), do: config
  def new(opts) when is_list(opts), do: opts |> Map.new() |> new()
  def new(opts) when is_map(opts), do: Jido.Chat.Schema.parse!(__MODULE__, @schema, opts)
end