fix!: handle php errors with custom error handling

This commit changes the api of the stream classes, since indication of
success or failure is no longer necessary.
This commit is contained in:
2026-02-13 23:26:32 +01:00
parent 3a5cad161d
commit 5797059008
14 changed files with 232 additions and 135 deletions

52
src/StreamTrait.php Normal file
View File

@@ -0,0 +1,52 @@
<?php
declare(strict_types=1);
namespace Nih\CommandBuilder;
use InvalidArgumentException;
trait StreamTrait
{
/**
* @param resource $stream
*
* @throws InvalidArgumentException When stream is not a stream
*/
public function __construct(private readonly mixed $stream)
{
if (get_resource_type($stream) !== 'stream') {
throw new InvalidArgumentException('resource is not a stream');
}
}
/**
* Close the stream.
*
* Noop if the stream was already closed.
*
* @throws StreamException
*/
public function close(): void
{
if (get_resource_type($this->stream) !== 'stream') {
return;
}
try {
set_error_handler(StreamException::handleError(...));
$success = fclose($this->stream);
} finally {
restore_error_handler();
}
assert($success);
}
public function __destruct()
{
if (get_resource_type($this->stream) === 'stream') {
fclose($this->stream);
}
}
}