<?php
/*
* This file is part of Chevere.
*
* (c) Rodolfo Berrios <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Chevere\Tests\src;
use Chevere\Parameter\Attributes\ArrayAttr;
use Chevere\Parameter\Attributes\BoolAttr;
use Chevere\Parameter\Attributes\CallableAttr;
use Chevere\Parameter\Attributes\EnumAttr;
use Chevere\Parameter\Attributes\FloatAttr;
use Chevere\Parameter\Attributes\IntAttr;
use Chevere\Parameter\Attributes\IterableAttr;
use Chevere\Parameter\Attributes\NullAttr;
use Chevere\Parameter\Attributes\ReturnAttr;
use Chevere\Parameter\Attributes\StringAttr;
use Chevere\Parameter\Attributes\UnionAttr;
use Chevere\Parameter\Interfaces\ParameterInterface;
use function Chevere\Parameter\Attributes\arrayArguments;
use function Chevere\Parameter\Attributes\arrayAttr;
use function Chevere\Parameter\Attributes\boolAttr;
use function Chevere\Parameter\Attributes\enumAttr;
use function Chevere\Parameter\Attributes\floatAttr;
use function Chevere\Parameter\Attributes\intAttr;
use function Chevere\Parameter\Attributes\iteratorAttr;
use function Chevere\Parameter\Attributes\nullAttr;
use function Chevere\Parameter\Attributes\returnAttr;
use function Chevere\Parameter\Attributes\stringAttr;
use function Chevere\Parameter\Attributes\unionAttr;
use function Chevere\Parameter\Attributes\valid;
use function Chevere\Parameter\int;
final class UsesAttr
{
#[ReturnAttr(
new CallableAttr(__CLASS__ . '::return')
)]
public function __construct(
#[StringAttr('/^[A-Za-z]+$/')]
string $name = 'Test',
#[IntAttr(min: 1, max: 100)]
int $age = 12,
#[ArrayAttr(
id: new CallableAttr(__CLASS__ . '::callable'),
)]
array $cols = [
'id' => 1,
],
#[IterableAttr(
new StringAttr('/^[A-Za-z]+$/'),
)]
iterable $tags = ['Chevere', 'Chevere', 'Chevere', 'Uh'],
#[BoolAttr()]
bool $flag = false,
#[FloatAttr(min: 0)]
float $amount = 0,
#[NullAttr()]
mixed $null = null,
#[EnumAttr('test', 'value')]
string $enum = 'value',
#[UnionAttr(
new IntAttr(min: 1),
new StringAttr('/^[A-Za-z]+$/'),
)]
int|string $union = 1,
) {
// Validate all
valid();
// Pick validation
valid('name');
valid('age');
valid('cols');
valid('tags');
valid('flag');
valid('amount');
// Get attribute, validate and return
$name = stringAttr('name')($name);
$age = intAttr('age')($age);
$cols = arrayAttr('cols')($cols);
$id = arrayArguments('cols')->required('id')->int();
$tags = iteratorAttr('tags')($tags);
$flag = boolAttr('flag')($flag);
$amount = floatAttr('amount')($amount);
$null = nullAttr('null')($null);
$enum = enumAttr('enum')($enum);
$union = unionAttr('union')($union);
// Validate return attr
returnAttr()($id);
}
public static function callable(): ParameterInterface
{
return int(min: 1);
}
public static function return(): ParameterInterface
{
return int();
}
#[ReturnAttr(
new IntAttr(min: 0, max: 5)
)]
public function run(int $int): int
{
return returnAttr()($int);
}
}
|