<?php
declare(strict_types=1);
namespace App\Component;
/**
* @template TValue
* @template TError
*/
final readonly class Result
{
/**
* @param TValue $value
* @param TError $error
*/
private function __construct(
private bool $success,
private mixed $value = null,
private mixed $error = null,
) {}
/**
* @template TSuccessValue
*
* @param TSuccessValue $value
*
* @return self<TSuccessValue, never>
*/
#[\NoDiscard]
public static function success(mixed $value = null): self
{
/** @var self<TSuccessValue, never> */
return new self(true, value: $value);
}
/**
* @template TFailureError
*
* @param TFailureError $error
*
* @return self<never, TFailureError>
*/
#[\NoDiscard]
public static function failure(mixed $error): self
{
/** @var self<never, TFailureError> */
return new self(false, error: $error);
}
public function isSuccess(): bool
{
return $this->success;
}
public function isFailure(): bool
{
return !$this->success;
}
/**
* @return TValue
*/
public function getValue(): mixed
{
return $this->value;
}
/**
* @return TError
*/
public function getError(): mixed
{
return $this->error;
}
}
Bug Report
Minimal PHP Code Causing Issue
See https://getrector.com/demo/05307445-cea2-4393-bbea-ee1d3de8827f
Responsible rules
RemoveDuplicatedReturnSelfDocblockRectorRemoveNonExistingVarAnnotationRectorExpected Behavior
RemoveDuplicatedReturnSelfDocblockRector-@returnhere is needed to narrow the return type for phpstanRemoveNonExistingVarAnnotationRector-@varis valid before a return statement and affects the returned value, also needed by phpstan