From 427ad80661d206765af6afbeccc4b9723c660888 Mon Sep 17 00:00:00 2001 From: Andrii Savluk Date: Thu, 30 Mar 2023 17:06:38 +0300 Subject: [PATCH] v1.13.2 --- src/Support/TypeGeneration/RefsResolver.php | 57 ++++++++++++++++----- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/src/Support/TypeGeneration/RefsResolver.php b/src/Support/TypeGeneration/RefsResolver.php index 0cd98c2..68a3e14 100644 --- a/src/Support/TypeGeneration/RefsResolver.php +++ b/src/Support/TypeGeneration/RefsResolver.php @@ -7,18 +7,19 @@ use Illuminate\Support\Str; use LogicException; use Savks\Negotiator\Enums\RefTypes; +use Savks\Negotiator\Support\Mapping\Mapper; class RefsResolver { /** * @param list $mapperVariants + * rule: string | (Closure(class-string): bool), + * resolver: Closure(array, class-string): (list|null), + * } | (Closure(class-string): (list|null))> $mapperVariants * @param list): (array|null), - * }> $enumVariants + * rule: string | (Closure(class-string): bool), + * resolver: Closure(array, class-string): (list|null), + * } | (Closure(class-string): (list|null))> $enumVariants */ public function __construct( protected readonly array $mapperVariants, @@ -54,14 +55,30 @@ protected function resolveEnumRef(string $enumFQN): array $enumName = null; foreach ($this->enumVariants as $variant) { - if (\preg_match($variant['pattern'], $enumFQN, $matches) > 0) { - $resolvedValue = $variant['resolver']($matches, $enumFQN); + if (\is_callable($variant)) { + $resolvedValue = $variant($enumFQN); if ($resolvedValue) { [$namespaceSegments, $enumName] = $resolvedValue; } + } else { + if (\is_callable($variant['rule'])) { + $isMatch = $variant['rule']($enumFQN); - break; + $matches = null; + } else { + $isMatch = \preg_match($variant['rule'], $enumFQN, $matches) > 0; + } + + if ($isMatch) { + $resolvedValue = $variant['resolver']($matches, $enumFQN); + + if ($resolvedValue) { + [$namespaceSegments, $enumName] = $resolvedValue; + } + + break; + } } } @@ -87,14 +104,30 @@ protected function resolveMapperRef(string $mapperFQN): array $mapperName = null; foreach ($this->mapperVariants as $variant) { - if (\preg_match($variant['pattern'], $mapperFQN, $matches) > 0) { - $resolvedValue = $variant['resolver']($matches, $mapperFQN); + if (\is_callable($variant)) { + $resolvedValue = $variant($mapperFQN); if ($resolvedValue) { [$namespaceSegments, $mapperName] = $resolvedValue; } + } else { + if (\is_callable($variant['rule'])) { + $isMatch = $variant['rule']($mapperFQN); - break; + $matches = null; + } else { + $isMatch = \preg_match($variant['rule'], $mapperFQN, $matches) > 0; + } + + if ($isMatch) { + $resolvedValue = $variant['resolver']($matches, $mapperFQN); + + if ($resolvedValue) { + [$namespaceSegments, $mapperName] = $resolvedValue; + } + + break; + } } }