* SPDX-License-Identifier: AGPL-3.0-or-later */ namespace KTXF\Mail\Submission; use InvalidArgumentException; use JsonSerializable; use KTXF\Resource\Identifier\EntityIdentifier; /** * Entity Submit Result * * Normalized result for outbound submission. * * @since 2026.06.07 */ final class EntitySubmitResult implements JsonSerializable { public const DISPOSITION_SENT = 'sent'; public const DISPOSITION_ERROR = 'error'; public function __construct( public readonly string $disposition, public readonly ?string $transportId = null, public readonly ?EntityIdentifier $sourceDraft = null, public readonly ?EntityIdentifier $sentEntity = null, public readonly ?string $errorCode = null, public readonly ?string $errorMessage = null, ) { if (!in_array($this->disposition, [self::DISPOSITION_SENT, self::DISPOSITION_ERROR], true)) { throw new InvalidArgumentException('Invalid submission disposition: ' . $this->disposition); } } public function jsonSerialize(): array { return array_filter([ 'disposition' => $this->disposition, 'transportId' => $this->transportId, 'sourceDraft' => $this->sourceDraft !== null ? (string)$this->sourceDraft : null, 'sentEntity' => $this->sentEntity !== null ? (string)$this->sentEntity : null, 'errorCode' => $this->errorCode, 'errorMessage' => $this->errorMessage, ], static fn(mixed $value): bool => $value !== null); } }