* SPDX-License-Identifier: MIT */ declare(strict_types=1); namespace Respect\Validation\Message; use ReflectionClass; use Respect\Stringifier\Stringifier; use Respect\Validation\Message\Placeholder\Listed; use Respect\Validation\Message\Placeholder\Quoted; use Respect\Validation\Result; use Respect\Validation\Rule; use function is_array; 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 = []; public function __construct( private readonly Stringifier $stringifier = new StandardStringifier(), ) { } public function render(Result $result, Translator $translator, string|null $template = null): string { $parameters = $result->parameters; $parameters['path'] = $result->path !== null ? Quoted::fromPath($result->path) : null; $parameters['input'] = $result->input; $builtName = $result->name ?? $parameters['path'] ?? $this->placeholder('input', $result->input, $translator); $parameters['name'] ??= $builtName; $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->adjacent !== null) { $rendered .= ' ' . $this->render($result->adjacent, $translator); } return $rendered; } /** @return array