$missingFields * @param array $metadata * @return array */ public function build( string $reasonCode, IdentityState $identityState, CanonicalKeyKind $keyKind, array $missingFields = [], array $metadata = [], ): array { $diagnostics = [ 'reason_code' => $reasonCode, 'identity_state' => $identityState->value, 'key_kind' => $keyKind->value, ]; if ($missingFields !== []) { $diagnostics['missing_fields'] = array_values(array_unique($missingFields)); } foreach ($metadata as $key => $value) { $key = (string) $key; $redacted = $this->redactor->redact([$key => $value]); $diagnostics[$key] = $this->bounded(is_array($redacted) ? ($redacted[$key] ?? null) : $redacted); } return $diagnostics; } private function bounded(mixed $value): mixed { if (is_string($value)) { return mb_substr($value, 0, 240); } if (is_array($value)) { return collect($value) ->take(16) ->map(fn (mixed $nested): mixed => $this->bounded($nested)) ->all(); } if (is_scalar($value) || $value === null) { return $value; } return (string) $value; } }