70 lines
1.5 KiB
PHP
70 lines
1.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Support\OpsUx;
|
|
|
|
final class SummaryCountsNormalizer
|
|
{
|
|
/**
|
|
* @param array<string, mixed> $summaryCounts
|
|
* @return array<string, int>
|
|
*/
|
|
public static function normalize(array $summaryCounts): array
|
|
{
|
|
$allowedKeys = array_flip(OperationSummaryKeys::all());
|
|
|
|
$sanitized = [];
|
|
|
|
foreach ($summaryCounts as $key => $value) {
|
|
$key = trim((string) $key);
|
|
|
|
if ($key === '' || ! isset($allowedKeys[$key])) {
|
|
continue;
|
|
}
|
|
|
|
if (is_int($value)) {
|
|
$sanitized[$key] = $value;
|
|
|
|
continue;
|
|
}
|
|
|
|
if (is_float($value) && is_finite($value)) {
|
|
$sanitized[$key] = (int) round($value);
|
|
|
|
continue;
|
|
}
|
|
|
|
if (is_numeric($value)) {
|
|
$sanitized[$key] = (int) $value;
|
|
}
|
|
}
|
|
|
|
return $sanitized;
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $summaryCounts
|
|
*/
|
|
public static function renderSummaryLine(array $summaryCounts): ?string
|
|
{
|
|
$normalized = self::normalize($summaryCounts);
|
|
|
|
if ($normalized === []) {
|
|
return null;
|
|
}
|
|
|
|
$parts = [];
|
|
|
|
foreach ($normalized as $key => $value) {
|
|
$parts[] = $key.': '.$value;
|
|
}
|
|
|
|
if ($parts === []) {
|
|
return null;
|
|
}
|
|
|
|
return 'Summary: '.implode(', ', $parts);
|
|
}
|
|
}
|