lib/workflow_metal/storage/schema/arc.ex

defmodule WorkflowMetal.Storage.Schema.Arc do
  @moduledoc """
  Present an arc.

  ## Example
  [A(place)] -1-> [B(transition)] -2-> [C(place)]

  ```elixir
    %__MODULE__{
      id: "id-1"
      workflow_id: "workflow_id"
      place_id: A
      transition_id: B
      direction: :out
    }
    %__MODULE__{
      id: "id-2"
      workflow_id: "workflow_id"
      place_id: C
      transition_id: B
      direction: :in
    }
  ```
  """

  use TypedStruct

  alias WorkflowMetal.Storage.Schema

  @type id :: term()
  @type direction :: :in | :out

  @type workflow_id :: Schema.Workflow.id()
  @type place_id :: Schema.Place.id()
  @type transition_id :: Schema.Transition.id()
  @type metadata :: map()

  typedstruct enforce: true do
    field :id, id()

    field :place_id, place_id()
    field :direction, direction()
    field :transition_id, transition_id()

    field :metadata, metadata(), enforce: false

    field :workflow_id, workflow_id()
  end
end