<?php

declare(strict_types=1);

namespace PhpWA\Runtime;

/**
 * Выполняет системный вызов без утечки ожидаемого PHP warning в HTTP/cron.
 *
 * В отличие от оператора @, граница видна для аудита, всегда восстанавливает
 * предыдущий handler и не перехватывает исключения вызываемого кода.
 *
 * @internal
 */
final class SafeRuntime
{
    /**
     * @param callable():mixed $operation
     * @param mixed $fallback
     * @return mixed
     */
    public static function call(callable $operation, $fallback = false)
    {
        $warning = null;
        set_error_handler(static function (int $severity, string $message) use (&$warning): bool {
            $warning = array('severity' => $severity, 'message' => $message);
            return true;
        });

        try {
            $result = $operation();
            return $warning === null ? $result : $fallback;
        } finally {
            restore_error_handler();
        }
    }

    private function __construct()
    {
    }
}
