*/ private array $typeNormalizers; public function __construct( private readonly DefaultPolicyNormalizer $defaultNormalizer, #[Tag('policy-type-normalizers')] iterable $typeNormalizers = [], ) { $normalizers = is_array($typeNormalizers) ? $typeNormalizers : iterator_to_array($typeNormalizers); $this->typeNormalizers = array_values(array_filter( $normalizers, fn (mixed $normalizer) => $normalizer instanceof PolicyTypeNormalizer )); } /** * @return array{status: string, settings: array>, settings_table?: array, warnings: array} */ public function normalize(?array $snapshot, string $policyType, ?string $platform = null): array { return $this->resolveNormalizer($policyType) ->normalize($snapshot, $policyType, $platform); } /** * @return array */ public function flattenForDiff(?array $snapshot, string $policyType, ?string $platform = null): array { return $this->resolveNormalizer($policyType) ->flattenForDiff($snapshot, $policyType, $platform); } /** * @param array $settings * @return array{type: string, groups: array>} */ public function normalizeSettingsCatalogGrouped(array $settings): array { return $this->defaultNormalizer->normalizeSettingsCatalogGrouped($settings); } private function resolveNormalizer(string $policyType): PolicyTypeNormalizer { foreach ($this->typeNormalizers as $normalizer) { if ($normalizer->supports($policyType)) { return $normalizer; } } return $this->defaultNormalizer; } }