mapper() * ->map(SomeClass::class, [ … ]); * } catch (\OCA\Talk\Vendor\CuyZ\Valinor\Mapper\MappingError $error) { * // Get a flattened list of all messages detected during mapping * $messages = $error->messages(); * * // Formatters can be added and will be applied on all messages * $messages = $messages->formatWith( * new \OCA\Talk\Vendor\CuyZ\Valinor\Mapper\Tree\Message\Formatter\MessageMapFormatter([ * // … * ]), * (new \OCA\Talk\Vendor\CuyZ\Valinor\Mapper\Tree\Message\Formatter\TranslationMessageFormatter()) * ->withTranslations([ * // … * ]) * ); * * foreach ($messages as $message) { * echo $message; * } * } * ``` * * @api * * @implements IteratorAggregate */ final class Messages implements IteratorAggregate, Countable { /** @var array */ private array $messages; /** @var array */ private array $formatters = []; /** * @internal * @no-named-arguments */ public function __construct(NodeMessage ...$messages) { $this->messages = $messages; } /** @pure */ public function errors(): self { $clone = clone $this; $clone->messages = array_filter($this->messages, fn (NodeMessage $message) => $message->isError()); return $clone; } /** @pure */ public function formatWith(MessageFormatter ...$formatters): self { $clone = clone $this; $clone->formatters = [...$clone->formatters, ...$formatters]; return $clone; } /** * @pure * @return list */ public function toArray(): array { /** @var list */ return iterator_to_array($this); } /** @pure */ public function count(): int { return count($this->messages); } /** * @return Iterator */ public function getIterator(): Iterator { foreach ($this->messages as $message) { foreach ($this->formatters as $formatter) { $message = $formatter->format($message); } yield $message; } } }