src/Helper/ExistingTestsLoader.php
<?php
/**
* This file is part of the browscap-helper package.
*
* Copyright (c) 2015-2024, Thomas Mueller <mimmi20@live.de>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types = 1);
namespace BrowscapHelper\Helper;
use BrowscapHelper\Source\OutputAwareInterface;
use BrowscapHelper\Source\SourceInterface;
use RuntimeException;
use Symfony\Component\Console\Output\OutputInterface;
use function mb_strlen;
use function sprintf;
use function str_pad;
final class ExistingTestsLoader
{
/**
* @param array<SourceInterface> $sources
*
* @return iterable<array<string, string>>
* @phpstan-return iterable<non-empty-string, array{headers: array<non-empty-string, non-empty-string>, device: array{deviceName: string|null, marketingName: string|null, manufacturer: string|null, brand: string|null, display: array{width: int|null, height: int|null, touch: bool|null, type: string|null, size: float|int|null}, type: string|null, ismobile: bool|null}, client: array{name: string|null, modus: string|null, version: string|null, manufacturer: string|null, bits: int|null, type: string|null, isbot: bool|null}, platform: array{name: string|null, marketingName: string|null, version: string|null, manufacturer: string|null, bits: int|null}, engine: array{name: string|null, version: string|null, manufacturer: string|null}}>
*
* @throws RuntimeException
*/
public function getProperties(OutputInterface $output, array $sources): iterable
{
$baseMessage = 'reading sources';
$message = $baseMessage . ' ...';
$messageLength = mb_strlen($message);
$output->writeln(
str_pad(string: $message, length: $messageLength),
OutputInterface::VERBOSITY_NORMAL,
);
foreach ($sources as $source) {
if ($source instanceof OutputAwareInterface) {
$source->setOutput($output);
}
$baseMessage = sprintf('reading from source %s ', $source->getName());
if (!$source->isReady($baseMessage)) {
continue;
}
$message = $baseMessage . '...';
if (mb_strlen($message) > $messageLength) {
$messageLength = mb_strlen($message);
}
$output->write(
"\r" . '<info>' . str_pad(string: $message, length: $messageLength) . '</info>',
false,
OutputInterface::VERBOSITY_VERBOSE,
);
yield from $source->getProperties($baseMessage, $messageLength);
$message = $baseMessage . '- done';
if (mb_strlen($message) > $messageLength) {
$messageLength = mb_strlen($message);
}
$output->writeln(
"\r" . '<info>' . str_pad(string: $message, length: $messageLength) . '</info>',
OutputInterface::VERBOSITY_VERBOSE,
);
}
}
}