Port.java

package org.hammer.audio.workflow;

import java.util.Objects;

/**
 * Pure workflow port definition independent of UI, execution and persistence.
 *
 * @param id stable port identifier
 * @param name human-readable port name
 * @param direction direction of data flow
 * @param dataType workflow-level data type
 * @param required whether the port must be connected
 * @param multiplicity whether the port accepts one or many connections
 * @param metadata extensible metadata for visualization or persistence adapters
 */
public record Port(
    String id,
    String name,
    PortDirection direction,
    DataType dataType,
    boolean required,
    PortMultiplicity multiplicity,
    Metadata metadata) {

  public Port {
    StableIds.requireStable(id, "id");
    if (name == null || name.isBlank()) {
      throw new IllegalArgumentException("name must not be blank");
    }
    Objects.requireNonNull(direction, "direction");
    Objects.requireNonNull(dataType, "dataType");
    Objects.requireNonNull(multiplicity, "multiplicity");
    metadata = metadata == null ? Metadata.empty() : metadata;
  }

  public Port(
      String id,
      String name,
      PortDirection direction,
      DataType dataType,
      boolean required,
      PortMultiplicity multiplicity) {
    this(id, name, direction, dataType, required, multiplicity, Metadata.empty());
  }

  public Port(
      String id,
      String name,
      PortDirection direction,
      String dataType,
      boolean required,
      PortMultiplicity multiplicity) {
    this(id, name, direction, new DataType(dataType), required, multiplicity, Metadata.empty());
  }

  public Port(
      String id,
      String name,
      PortDirection direction,
      String dataType,
      boolean required,
      PortMultiplicity multiplicity,
      Metadata metadata) {
    this(id, name, direction, new DataType(dataType), required, multiplicity, metadata);
  }
}