From b6b63a7121e4f4d5ac42d16acb6f5d84ae5dbf5f Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Fri, 8 May 2026 01:58:47 +0200 Subject: [PATCH] feat(form-builder): validForTargetType method on FormFieldBindingMergeStrategy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per RFC-WS-6 §V1 + ARCH-BINDINGS §4.2. Implements the strategy x target-type validity matrix. Append is the only non-trivial case: valid only for COLLECTION targets. The AppendStrategyRequiresCollectionTarget publish-guard uses this method (D2 wiring confirms call sites; this commit provides the building block). Existing methods (nullWinnerBehaviour, isValidForScalarTargets) untouched. Co-Authored-By: Claude Opus 4.7 --- .../FormFieldBindingMergeStrategy.php | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/api/app/Enums/FormBuilder/FormFieldBindingMergeStrategy.php b/api/app/Enums/FormBuilder/FormFieldBindingMergeStrategy.php index f66c0708..8df5558d 100644 --- a/api/app/Enums/FormBuilder/FormFieldBindingMergeStrategy.php +++ b/api/app/Enums/FormBuilder/FormFieldBindingMergeStrategy.php @@ -37,4 +37,31 @@ enum FormFieldBindingMergeStrategy: string { return $this !== self::Append; } + + /** + * Whether this strategy is structurally valid against the given target + * type. + * + * Per RFC-WS-6 §V1 + ARCH-BINDINGS §4.2 (strategy x target-type validity matrix). + * + * | SCALAR | COLLECTION | RELATION | + * Overwrite | valid | valid* | valid | + * Append | INVALID| valid | INVALID | + * Replace | valid | valid | valid | + * FirstWriteWins | valid | valid | valid | + * + * * unusual but valid (overwrites entire collection) + * + * The PublishGuard AppendStrategyRequiresCollectionTarget uses this + * method to validate at publish time. Append on scalars is rejected + * because it requires a fingerprint mechanism for retry-idempotency + * that would embed implementation detail in domain data. + */ + public function validForTargetType(BindingTargetType $type): bool + { + return match ($this) { + self::Append => $type === BindingTargetType::COLLECTION, + default => true, + }; + } }