diff --git a/src/bundle/Core/Command/DebugConfigResolverCommand.php b/src/bundle/Core/Command/DebugConfigResolverCommand.php index 8062d34248..8cfc5f0948 100644 --- a/src/bundle/Core/Command/DebugConfigResolverCommand.php +++ b/src/bundle/Core/Command/DebugConfigResolverCommand.php @@ -8,6 +8,7 @@ namespace Ibexa\Bundle\Core\Command; use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface; +use Ibexa\Core\Base\Exceptions\InvalidArgumentException; use Ibexa\Core\MVC\Symfony\SiteAccess; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; @@ -69,6 +70,18 @@ public function configure(): void InputOption::VALUE_REQUIRED, 'Set a different namespace than the default "ibexa.site_access.config" used by SiteAccess settings.' ); + $this->addOption( + 'sort', + null, + InputOption::VALUE_REQUIRED, + 'Sort list of hashes by this key, ascending. For example: --sort position' + ); + $this->addOption( + 'reverse-sort', + null, + InputOption::VALUE_NONE, + 'Reverse the sorting to descending. For example: --sort priority --reverse-sort' + ); $this->setHelp( <<getArgument('parameter'); $namespace = $input->getOption('namespace'); $scope = $input->getOption('scope'); + $sort = $input->getOption('sort'); $parameterData = $this->configResolver->getParameter($parameter, $namespace, $scope); + if (null !== $sort && !empty($parameterData)) { + if (!is_array($parameterData)) { + throw new InvalidArgumentException('--sort', "'$parameter' isn't a list. Sort can be used only on a list."); + } + if (!array_is_list($parameterData)) { + throw new InvalidArgumentException('--sort', "'$parameter' is a hash but sort can be used only on a list (an array with numeral keys incremented from zero)."); + } + foreach ($parameterData as $item) { + if (!is_array($item) || array_is_list($item)) { + throw new InvalidArgumentException('--sort', "'$parameter' list items aren't all hashes. Sort can be used only on a list of hashes."); + } + if (!array_key_exists($sort, $item)) { + throw new InvalidArgumentException('--sort', "'$sort' property doesn't exist on each '$parameter' list item."); + } + if (!is_scalar($item[$sort])) { + throw new InvalidArgumentException('--sort', "'$sort' properties aren't always scalar and can't be sorted."); + } + } + if ($input->getOption('reverse-sort')) { + usort($parameterData, static fn (array $a, array $b): int => $b[$sort] <=> $a[$sort]); + } else { + usort($parameterData, static fn (array $a, array $b): int => $a[$sort] <=> $b[$sort]); + } + } + // In case of json output return early with no newlines and only the parameter data if ($input->getOption('json')) { $output->write(json_encode($parameterData));