* SPDX-License-Identifier: MIT */ declare(strict_types=1); namespace Respect\Validation\Message; use ReflectionClass; use Respect\Stringifier\Stringifier; use Respect\Stringifier\Stringifiers\CompositeStringifier; use Respect\Validation\Mode; use Respect\Validation\Result; use Respect\Validation\Rule; use function is_bool; use function is_scalar; use function is_string; use function preg_replace_callback; use function print_r; final class StandardRenderer implements Renderer { /** @var array> */ private array $templates = []; private readonly Stringifier $stringifier; public function __construct(?Stringifier $stringifier = null) { $this->stringifier = $stringifier ?? CompositeStringifier::createDefault(); } public function render(Result $result, Translator $translator, ?string $template = null): string { $parameters = $result->parameters; $parameters['name'] ??= $result->name ?? $this->placeholder('input', $result->input, $translator); $parameters['input'] = $result->input; $rendered = (string) preg_replace_callback( '/{{(\w+)(\|([^}]+))?}}/', function (array $matches) use ($parameters, $translator) { if (!isset($parameters[$matches[1]])) { return $matches[0]; } return $this->placeholder($matches[1], $parameters[$matches[1]], $translator, $matches[3] ?? null); }, $translator->translate($template ?? $this->getTemplateMessage($result)) ); if (!$result->hasCustomTemplate() && $result->subsequent !== null) { $rendered .= ' ' . $this->render($result->subsequent, $translator); } return $rendered; } /** @return array