lib/membrane/bin/pad_data.ex

defmodule Membrane.Bin.PadData do
  @moduledoc """
  Struct describing current pad state.

  The public fields are:
    - `:accepted_caps` - specification of possible caps that are accepted on the pad.
      See `Membrane.Caps.Matcher` for more information.
    - `:availability` - see `Membrane.Pad.availability_t`
    - `:direction` - see `Membrane.Pad.direction_t`
    - `:mode` - see `Membrane.Pad.mode_t`
    - `:name` - see `Membrane.Pad.name_t`. Do not mistake with `:ref`
    - `:options` - options passed in `Membrane.ParentSpec` when linking pad
    - `:ref` - see `Membrane.Pad.ref_t`

  Other fields in the struct ARE NOT PART OF THE PUBLIC API and should not be
  accessed or relied on.
  """
  use Bunch.Access

  @type private_field :: term()

  @type t :: %__MODULE__{
          ref: Membrane.Pad.ref_t(),
          options: Membrane.ParentSpec.pad_options_t(),
          accepted_caps: Membrane.Caps.Matcher.caps_specs_t(),
          availability: Membrane.Pad.availability_t(),
          direction: Membrane.Pad.direction_t(),
          mode: Membrane.Pad.mode_t(),
          name: Membrane.Pad.name_t(),
          link_id: private_field,
          endpoint: private_field,
          linked?: private_field,
          response_received?: private_field,
          spec_ref: private_field,
          demand_unit: private_field
        }

  @enforce_keys [
    :ref,
    :options,
    :accepted_caps,
    :availability,
    :direction,
    :mode,
    :name,
    :link_id,
    :endpoint,
    :linked?,
    :response_received?,
    :spec_ref
  ]

  defstruct @enforce_keys ++ [demand_unit: nil]
end