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; + } } }