diff --git a/.github/workflows/ci-code.yml b/.github/workflows/ci-code.yml index 619aaaedc..ce114192b 100644 --- a/.github/workflows/ci-code.yml +++ b/.github/workflows/ci-code.yml @@ -27,6 +27,7 @@ jobs: - run: composer phpunit - run: composer pest + - run: composer inference code-coverage: name: Code Coverage diff --git a/composer.json b/composer.json index c07cb11b5..bdc29e257 100644 --- a/composer.json +++ b/composer.json @@ -5,6 +5,8 @@ "type": "library", "homepage": "http://respect.github.io/", "license": "MIT", + "minimum-stability": "dev", + "prefer-stable": true, "authors": [ { "name": "Respect/Validation Contributors", @@ -23,7 +25,7 @@ "php": ">=8.5", "psr/container": "^2.0", "respect/config": "^3.0", - "respect/fluent": "^2.0", + "respect/fluent": "3.0.x-dev", "respect/parameter": "^3.0", "respect/string-formatter": "^1.7", "respect/stringifier": "^3.0", @@ -45,7 +47,7 @@ "psr/http-message": "^1.0 || ^2.0", "ramsey/uuid": "^4", "respect/coding-standard": "^5.0", - "respect/fluentgen": "^2.0", + "respect/fluentgen": "2.1.x-dev", "sebastian/diff": "^7.0", "sokil/php-isocodes": "^4.2.1", "sokil/php-isocodes-db-only": "^4.0", @@ -87,6 +89,7 @@ "phpcs": "vendor/bin/phpcs", "phpstan": "vendor/bin/phpstan analyze", "phpunit": "vendor/bin/phpunit --testsuite=unit", + "inference": "vendor/bin/phpunit --testsuite=inference", "smoke-complete": "bin/console smoke-tests:check-complete", "spdx-lint": "bin/console lint:spdx", "qa": [ @@ -95,6 +98,7 @@ "@phpstan", "@phpunit", "@pest", + "@inference", "@docs", "@smoke-complete" ] diff --git a/composer.lock b/composer.lock index dd0c2d383..7743fae6c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "683a4f0e3e7054eddcef31faf9cc9b1c", + "content-hash": "eb09c441327241556e460c98c2728154", "packages": [ { "name": "psr/container", @@ -122,16 +122,16 @@ }, { "name": "respect/fluent", - "version": "2.0.1", + "version": "dev-ide-narrowing", "source": { "type": "git", "url": "https://github.com/Respect/Fluent.git", - "reference": "f32c76e37a82a9e63d6fe700a27201534f72da60" + "reference": "8469e6e8d30d28f36c0b79a381703ea9b26b0ecd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Respect/Fluent/zipball/f32c76e37a82a9e63d6fe700a27201534f72da60", - "reference": "f32c76e37a82a9e63d6fe700a27201534f72da60", + "url": "https://api.github.com/repos/Respect/Fluent/zipball/8469e6e8d30d28f36c0b79a381703ea9b26b0ecd", + "reference": "8469e6e8d30d28f36c0b79a381703ea9b26b0ecd", "shasum": "" }, "require": { @@ -142,10 +142,15 @@ "phpstan/phpstan-deprecation-rules": "^2.0", "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^12.5", + "phpunit/phpunit": "^12.5 || ^13.0", "respect/coding-standard": "^5.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-ide-narrowing": "3.0.x-dev" + } + }, "autoload": { "psr-4": { "Respect\\Fluent\\": "src/" @@ -169,9 +174,9 @@ ], "support": { "issues": "https://github.com/Respect/Fluent/issues", - "source": "https://github.com/Respect/Fluent/tree/2.0.1" + "source": "https://github.com/Respect/Fluent/tree/ide-narrowing" }, - "time": "2026-03-26T04:24:51+00:00" + "time": "2026-06-26T19:36:25+00:00" }, { "name": "respect/parameter", @@ -2191,16 +2196,16 @@ }, { "name": "pestphp/pest", - "version": "v4.7.3", + "version": "v4.7.4", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "87882a8561bf3ddf230b9a6b764f367f687d5b2f" + "reference": "ee2e97e932d158faceeaa63a4dc17324b15152cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/87882a8561bf3ddf230b9a6b764f367f687d5b2f", - "reference": "87882a8561bf3ddf230b9a6b764f367f687d5b2f", + "url": "https://api.github.com/repos/pestphp/pest/zipball/ee2e97e932d158faceeaa63a4dc17324b15152cb", + "reference": "ee2e97e932d158faceeaa63a4dc17324b15152cb", "shasum": "" }, "require": { @@ -2213,12 +2218,12 @@ "pestphp/pest-plugin-mutate": "^4.0.1", "pestphp/pest-plugin-profanity": "^4.2.1", "php": "^8.3.0", - "phpunit/phpunit": "^12.5.29", + "phpunit/phpunit": "^12.5.30", "symfony/process": "^7.4.13|^8.1.0" }, "conflict": { "filp/whoops": "<2.18.3", - "phpunit/phpunit": ">12.5.29", + "phpunit/phpunit": ">12.5.30", "sebastian/exporter": "<7.0.0", "webmozart/assert": "<1.11.0" }, @@ -2294,7 +2299,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v4.7.3" + "source": "https://github.com/pestphp/pest/tree/v4.7.4" }, "funding": [ { @@ -2306,7 +2311,7 @@ "type": "github" } ], - "time": "2026-06-12T05:57:27+00:00" + "time": "2026-06-25T19:09:05+00:00" }, { "name": "pestphp/pest-plugin", @@ -3636,16 +3641,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.29", + "version": "12.5.30", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9aa66a47db3ea70f1a468e66dd969f67e594945a" + "reference": "900400a5b616d6fb306f9549f6da33ba615d3fbb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9aa66a47db3ea70f1a468e66dd969f67e594945a", - "reference": "9aa66a47db3ea70f1a468e66dd969f67e594945a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/900400a5b616d6fb306f9549f6da33ba615d3fbb", + "reference": "900400a5b616d6fb306f9549f6da33ba615d3fbb", "shasum": "" }, "require": { @@ -3714,7 +3719,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.29" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.30" }, "funding": [ { @@ -3722,7 +3727,7 @@ "type": "other" } ], - "time": "2026-06-04T06:14:42+00:00" + "time": "2026-06-15T13:12:30+00:00" }, { "name": "psr/cache", @@ -4126,16 +4131,16 @@ }, { "name": "respect/fluentgen", - "version": "2.0.0", + "version": "dev-ide-narrowing", "source": { "type": "git", "url": "https://github.com/Respect/FluentGen.git", - "reference": "6a9065516f403c5f5abc86646290bd08e44c538e" + "reference": "518208d2a690ad0229c05ae6f001348dc6936da0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Respect/FluentGen/zipball/6a9065516f403c5f5abc86646290bd08e44c538e", - "reference": "6a9065516f403c5f5abc86646290bd08e44c538e", + "url": "https://api.github.com/repos/Respect/FluentGen/zipball/518208d2a690ad0229c05ae6f001348dc6936da0", + "reference": "518208d2a690ad0229c05ae6f001348dc6936da0", "shasum": "" }, "require": { @@ -4148,12 +4153,17 @@ "phpstan/phpstan-strict-rules": "^2.0", "phpunit/phpunit": "^12.5", "respect/coding-standard": "^5.0", - "respect/fluent": "^2.0" + "respect/fluent": "3.0.x-dev" }, "suggest": { "respect/fluent": "Enables #[Composable] prefix composition support" }, "type": "library", + "extra": { + "branch-alias": { + "dev-ide-narrowing": "2.1.x-dev" + } + }, "autoload": { "psr-4": { "Respect\\FluentGen\\": "src/" @@ -4178,9 +4188,9 @@ ], "support": { "issues": "https://github.com/Respect/FluentGen/issues", - "source": "https://github.com/Respect/FluentGen/tree/2.0.0" + "source": "https://github.com/Respect/FluentGen/tree/ide-narrowing" }, - "time": "2026-03-25T05:50:09+00:00" + "time": "2026-06-26T19:40:15+00:00" }, { "name": "sebastian/cli-parser", @@ -6809,9 +6819,12 @@ } ], "aliases": [], - "minimum-stability": "stable", - "stability-flags": {}, - "prefer-stable": false, + "minimum-stability": "dev", + "stability-flags": { + "respect/fluent": 20, + "respect/fluentgen": 20 + }, + "prefer-stable": true, "prefer-lowest": false, "platform": { "php": ">=8.5" diff --git a/phpcs.xml.dist b/phpcs.xml.dist index 20d17139b..0cc9bec8f 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -15,6 +15,9 @@ src-dev/ tests/ + + tests/inference/assertions/* + @@ -28,6 +31,21 @@ src/Mixins/ tests/feature/ + + + src/Mixins/ + + + src/Mixins/ + + + src/Mixins/ + + + src/Mixins/ + tests/Pest.php tests/feature diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 47b7facab..1d4255f51 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -23,6 +23,16 @@ parameters: path: tests/src/Message/TestingHandler.php - message: '/Property Respect\\Validation\\Test\\Stubs\\.+::\$[a-zA-Z]+ is never read, only written./' path: tests/src/Stubs + - + # Why: src/Mixins/* are generated typing aids. Their @return Chain<...> carry the + # narrowing types derived from #[Assurance] (the same ones FluentAnalysis computes + # at analysis time), e.g. bare `array` or `ArrayAccess`. Fully parameterising those + # generics would only clutter the IDE-facing types without adding narrowing value. + identifier: missingType.iterableValue + path: src/Mixins/* + - + identifier: missingType.generics + path: src/Mixins/* level: 8 treatPhpDocTypesAsCertain: false paths: diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 51339be5c..8dae82703 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -14,6 +14,9 @@ ./tests/feature + + tests/inference/ + diff --git a/src-dev/Commands/LintMixinCommand.php b/src-dev/Commands/LintMixinCommand.php index a31f6b188..a3e1644bf 100644 --- a/src-dev/Commands/LintMixinCommand.php +++ b/src-dev/Commands/LintMixinCommand.php @@ -18,6 +18,7 @@ use Respect\FluentGen\Fluent\MethodBuilder; use Respect\FluentGen\Fluent\MixinGenerator; use Respect\FluentGen\Fluent\PrefixConstantsGenerator; +use Respect\FluentGen\Fluent\TerminalMethod; use Respect\FluentGen\NamespaceScanner; use Respect\Validation\Mixins\Chain; use Respect\Validation\Validator; @@ -82,6 +83,7 @@ interfaces: [ suffix: 'Builder', returnType: Chain::class, static: true, + emitNarrowing: true, ), new InterfaceConfig( suffix: 'Chain', @@ -89,6 +91,29 @@ interfaces: [ rootExtends: [Validator::class], rootComment: '@mixin ValidatorBuilder', rootUses: [ValidatorBuilder::class], + emitNarrowing: true, + templateParam: 'TSure', + terminalMethods: [ + new TerminalMethod( + name: 'assert', + returnType: 'void', + parameters: ['input' => 'mixed'], + comments: ['@phpstan-assert TSure $input', '@psalm-assert TSure $input'], + optionalParameters: ['template' => 'mixed'], + ), + new TerminalMethod( + name: 'check', + returnType: 'void', + parameters: ['input' => 'mixed'], + comments: ['@phpstan-assert TSure $input', '@psalm-assert TSure $input'], + optionalParameters: ['template' => 'mixed'], + ), + new TerminalMethod( + name: 'isValid', + returnType: 'bool', + parameters: ['input' => 'mixed'], + ), + ], ), ], ); diff --git a/src/Mixins/AllBuilder.php b/src/Mixins/AllBuilder.php index ea6f9af97..0c4f53f7c 100644 --- a/src/Mixins/AllBuilder.php +++ b/src/Mixins/AllBuilder.php @@ -17,300 +17,462 @@ interface AllBuilder { + /** @return Chain */ public static function allAfter(callable $callable, Validator $validator): Chain; + /** @return Chain */ public static function allAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain> */ public static function allAlnum(string ...$additionalChars): Chain; + /** @return Chain> */ public static function allAlpha(string ...$additionalChars): Chain; + /** @return Chain */ public static function allAlwaysInvalid(): Chain; + /** @return Chain */ public static function allAlwaysValid(): Chain; + /** @return Chain */ public static function allAnyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain> */ public static function allArrayType(): Chain; + /** @return Chain> */ public static function allArrayVal(): Chain; + /** @return Chain */ public static function allBase(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain> */ public static function allBase64(): Chain; + /** @return Chain */ public static function allBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public static function allBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public static function allBlank(): Chain; + /** @return Chain> */ public static function allBoolType(): Chain; + /** @return Chain> */ public static function allBoolVal(): Chain; + /** @return Chain> */ public static function allBsn(): Chain; + /** @return Chain> */ public static function allCallableType(): Chain; + /** @return Chain> */ public static function allCharset(string $charset, string ...$charsets): Chain; + /** @return Chain> */ public static function allCnh(): Chain; + /** @return Chain> */ public static function allCnpj(): Chain; + /** @return Chain> */ public static function allConsonant(string ...$additionalChars): Chain; + /** @return Chain> */ public static function allContains(mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain> + */ public static function allContainsAny(array $needles): Chain; + /** @return Chain> */ public static function allContainsCount(mixed $containsValue, int $count): Chain; + /** @return Chain> */ public static function allControl(string ...$additionalChars): Chain; + /** @return Chain> */ public static function allCountable(): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain> + */ public static function allCountryCode(string $set = 'alpha-2'): Chain; + /** @return Chain> */ public static function allCpf(): Chain; + /** @return Chain> */ public static function allCreditCard(string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain> + */ public static function allCurrencyCode(string $set = 'alpha-3'): Chain; + /** @return Chain> */ public static function allDate(string $format = 'Y-m-d'): Chain; + /** @return Chain> */ public static function allDateTime(string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain> + */ public static function allDateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain> */ public static function allDecimal(int $decimals): Chain; + /** @return Chain> */ public static function allDigit(string ...$additionalChars): Chain; + /** @return Chain> */ public static function allDirectory(): Chain; + /** @return Chain> */ public static function allDomain(bool $tldCheck = true): Chain; + /** @return Chain */ public static function allEach(Validator $validator): Chain; + /** @return Chain */ public static function allEachKey(Validator $validator): Chain; + /** @return Chain> */ public static function allEmail(): Chain; + /** @return Chain> */ public static function allEmoji(): Chain; + /** @return Chain> */ public static function allEndsWith(mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public static function allEquals(mixed $compareTo): Chain; + /** @return Chain */ public static function allEquivalent(mixed $compareTo): Chain; + /** @return Chain> */ public static function allEven(): Chain; + /** @return Chain> */ public static function allExecutable(): Chain; + /** @return Chain> */ public static function allExtension(string $extension): Chain; + /** @return Chain */ public static function allFactor(int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public static function allFactory(callable $factory): Chain; + /** @return Chain> */ public static function allFalseVal(): Chain; + /** @return Chain */ public static function allFalsy(): Chain; + /** @return Chain> */ public static function allFile(): Chain; + /** @return Chain> */ public static function allFinite(): Chain; + /** @return Chain> */ public static function allFloatType(): Chain; + /** @return Chain> */ public static function allFloatVal(): Chain; + /** @return Chain> */ public static function allFormat(Formatter $formatter): Chain; + /** @return Chain */ public static function allGiven(Validator $when, Validator $then): Chain; + /** @return Chain> */ public static function allGraph(string ...$additionalChars): Chain; + /** @return Chain */ public static function allGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public static function allGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain> */ public static function allHetu(): Chain; + /** @return Chain> */ public static function allHexRgbColor(): Chain; + /** @return Chain> */ public static function allIban(): Chain; + /** @return Chain */ public static function allIdentical(mixed $compareTo): Chain; + /** @return Chain> */ public static function allImage(): Chain; + /** @return Chain> */ public static function allImei(): Chain; + /** @return Chain */ public static function allIn(mixed $haystack): Chain; + /** @return Chain> */ public static function allInfinite(): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public static function allInstance(string $class): Chain; + /** @return Chain> */ public static function allIntType(): Chain; + /** @return Chain> */ public static function allIntVal(): Chain; + /** @return Chain> */ public static function allIp(string $range = '*', int|null $options = null): Chain; + /** @return Chain> */ public static function allIsbn(): Chain; + /** @return Chain> */ public static function allIterableType(): Chain; + /** @return Chain> */ public static function allIterableVal(): Chain; + /** @return Chain> */ public static function allJson(): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain> + */ public static function allLanguageCode(string $set = 'alpha-2'): Chain; + /** @return Chain> */ public static function allLeapDate(string $format): Chain; + /** @return Chain> */ public static function allLeapYear(): Chain; + /** @return Chain */ public static function allLength(Validator $validator): Chain; + /** @return Chain */ public static function allLessThan(mixed $compareTo): Chain; + /** @return Chain */ public static function allLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain> */ public static function allLowercase(): Chain; + /** @return Chain> */ public static function allLuhn(): Chain; + /** @return Chain> */ public static function allMacAddress(): Chain; + /** @return Chain */ public static function allMax(Validator $validator): Chain; + /** @return Chain> */ public static function allMimetype(string $mimetype): Chain; + /** @return Chain */ public static function allMin(Validator $validator): Chain; + /** @return Chain */ public static function allMultiple(int $multipleOf): Chain; + /** @return Chain> */ public static function allNegative(): Chain; + /** @return Chain> */ public static function allNfeAccessKey(): Chain; + /** @return Chain> */ public static function allNif(): Chain; + /** @return Chain> */ public static function allNip(): Chain; + /** @return Chain */ public static function allNoneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function allNot(Validator $validator): Chain; + /** @return Chain> */ public static function allNullType(): Chain; + /** @return Chain> */ public static function allNumber(): Chain; + /** @return Chain> */ public static function allNumericVal(): Chain; + /** @return Chain> */ public static function allObjectType(): Chain; + /** @return Chain> */ public static function allOdd(): Chain; + /** @return Chain */ public static function allOneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain> */ public static function allPesel(): Chain; + /** @return Chain> */ public static function allPhone(string|null $countryCode = null): Chain; + /** @return Chain> */ public static function allPis(): Chain; + /** @return Chain> */ public static function allPolishIdCard(): Chain; + /** @return Chain> */ public static function allPortugueseNif(): Chain; + /** @return Chain> */ public static function allPositive(): Chain; + /** @return Chain> */ public static function allPostalCode(string $countryCode, bool $formatted = false): Chain; + /** @return Chain> */ public static function allPrintable(string ...$additionalChars): Chain; + /** @return Chain> */ public static function allPublicDomainSuffix(): Chain; + /** @return Chain> */ public static function allPunct(string ...$additionalChars): Chain; + /** @return Chain> */ public static function allReadable(): Chain; + /** @return Chain> */ public static function allRegex(string $regex): Chain; + /** @return Chain> */ public static function allResourceType(): Chain; + /** @return Chain> */ public static function allRoman(): Chain; + /** @return Chain */ public static function allSatisfies(callable $callback, mixed ...$arguments): Chain; + /** @return Chain> */ public static function allScalarVal(): Chain; + /** @return Chain */ public static function allShortCircuit(Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain> + */ public static function allSize(string $unit, Validator $validator): Chain; + /** @return Chain> */ public static function allSlug(): Chain; + /** @return Chain> */ public static function allSorted(string $direction): Chain; + /** @return Chain> */ public static function allSpace(string ...$additionalChars): Chain; + /** @return Chain> */ public static function allSpaced(): Chain; + /** @return Chain> */ public static function allStartsWith(mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain> */ public static function allStringType(): Chain; + /** @return Chain> */ public static function allStringVal(): Chain; + /** @return Chain> */ public static function allSubdivisionCode(string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain> + */ public static function allSubset(array $superset): Chain; + /** @return Chain> */ public static function allSymbolicLink(): Chain; + /** @return Chain> */ public static function allTime(string $format = 'H:i:s'): Chain; + /** @return Chain> */ public static function allTld(): Chain; + /** @return Chain> */ public static function allTrimmed(string ...$trimValues): Chain; + /** @return Chain> */ public static function allTrueVal(): Chain; + /** @return Chain> */ public static function allUndef(): Chain; + /** @return Chain> */ public static function allUnique(): Chain; + /** @return Chain> */ public static function allUppercase(): Chain; + /** @return Chain> */ public static function allUrl(): Chain; + /** @return Chain> */ public static function allUuid(int|null $version = null): Chain; + /** @return Chain> */ public static function allVersion(): Chain; + /** @return Chain> */ public static function allVowel(string ...$additionalChars): Chain; + /** @return Chain */ public static function allWhen(Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain> */ public static function allWritable(): Chain; + /** @return Chain> */ public static function allXdigit(string ...$additionalChars): Chain; } diff --git a/src/Mixins/AllChain.php b/src/Mixins/AllChain.php index 521337b09..d62485a21 100644 --- a/src/Mixins/AllChain.php +++ b/src/Mixins/AllChain.php @@ -17,300 +17,462 @@ interface AllChain { + /** @return Chain */ public function allAfter(callable $callable, Validator $validator): Chain; + /** @return Chain */ public function allAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function allAlnum(string ...$additionalChars): Chain; + /** @return Chain */ public function allAlpha(string ...$additionalChars): Chain; + /** @return Chain */ public function allAlwaysInvalid(): Chain; + /** @return Chain */ public function allAlwaysValid(): Chain; + /** @return Chain */ public function allAnyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function allArrayType(): Chain; + /** @return Chain */ public function allArrayVal(): Chain; + /** @return Chain */ public function allBase(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public function allBase64(): Chain; + /** @return Chain */ public function allBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public function allBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public function allBlank(): Chain; + /** @return Chain */ public function allBoolType(): Chain; + /** @return Chain */ public function allBoolVal(): Chain; + /** @return Chain */ public function allBsn(): Chain; + /** @return Chain */ public function allCallableType(): Chain; + /** @return Chain */ public function allCharset(string $charset, string ...$charsets): Chain; + /** @return Chain */ public function allCnh(): Chain; + /** @return Chain */ public function allCnpj(): Chain; + /** @return Chain */ public function allConsonant(string ...$additionalChars): Chain; + /** @return Chain */ public function allContains(mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public function allContainsAny(array $needles): Chain; + /** @return Chain */ public function allContainsCount(mixed $containsValue, int $count): Chain; + /** @return Chain */ public function allControl(string ...$additionalChars): Chain; + /** @return Chain */ public function allCountable(): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public function allCountryCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public function allCpf(): Chain; + /** @return Chain */ public function allCreditCard(string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public function allCurrencyCode(string $set = 'alpha-3'): Chain; + /** @return Chain */ public function allDate(string $format = 'Y-m-d'): Chain; + /** @return Chain */ public function allDateTime(string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public function allDateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public function allDecimal(int $decimals): Chain; + /** @return Chain */ public function allDigit(string ...$additionalChars): Chain; + /** @return Chain */ public function allDirectory(): Chain; + /** @return Chain */ public function allDomain(bool $tldCheck = true): Chain; + /** @return Chain */ public function allEach(Validator $validator): Chain; + /** @return Chain */ public function allEachKey(Validator $validator): Chain; + /** @return Chain */ public function allEmail(): Chain; + /** @return Chain */ public function allEmoji(): Chain; + /** @return Chain */ public function allEndsWith(mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public function allEquals(mixed $compareTo): Chain; + /** @return Chain */ public function allEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public function allEven(): Chain; + /** @return Chain */ public function allExecutable(): Chain; + /** @return Chain */ public function allExtension(string $extension): Chain; + /** @return Chain */ public function allFactor(int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public function allFactory(callable $factory): Chain; + /** @return Chain */ public function allFalseVal(): Chain; + /** @return Chain */ public function allFalsy(): Chain; + /** @return Chain */ public function allFile(): Chain; + /** @return Chain */ public function allFinite(): Chain; + /** @return Chain */ public function allFloatType(): Chain; + /** @return Chain */ public function allFloatVal(): Chain; + /** @return Chain */ public function allFormat(Formatter $formatter): Chain; + /** @return Chain */ public function allGiven(Validator $when, Validator $then): Chain; + /** @return Chain */ public function allGraph(string ...$additionalChars): Chain; + /** @return Chain */ public function allGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public function allGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function allHetu(): Chain; + /** @return Chain */ public function allHexRgbColor(): Chain; + /** @return Chain */ public function allIban(): Chain; + /** @return Chain */ public function allIdentical(mixed $compareTo): Chain; + /** @return Chain */ public function allImage(): Chain; + /** @return Chain */ public function allImei(): Chain; + /** @return Chain */ public function allIn(mixed $haystack): Chain; + /** @return Chain */ public function allInfinite(): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public function allInstance(string $class): Chain; + /** @return Chain */ public function allIntType(): Chain; + /** @return Chain */ public function allIntVal(): Chain; + /** @return Chain */ public function allIp(string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public function allIsbn(): Chain; + /** @return Chain */ public function allIterableType(): Chain; + /** @return Chain */ public function allIterableVal(): Chain; + /** @return Chain */ public function allJson(): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public function allLanguageCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public function allLeapDate(string $format): Chain; + /** @return Chain */ public function allLeapYear(): Chain; + /** @return Chain */ public function allLength(Validator $validator): Chain; + /** @return Chain */ public function allLessThan(mixed $compareTo): Chain; + /** @return Chain */ public function allLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function allLowercase(): Chain; + /** @return Chain */ public function allLuhn(): Chain; + /** @return Chain */ public function allMacAddress(): Chain; + /** @return Chain */ public function allMax(Validator $validator): Chain; + /** @return Chain */ public function allMimetype(string $mimetype): Chain; + /** @return Chain */ public function allMin(Validator $validator): Chain; + /** @return Chain */ public function allMultiple(int $multipleOf): Chain; + /** @return Chain */ public function allNegative(): Chain; + /** @return Chain */ public function allNfeAccessKey(): Chain; + /** @return Chain */ public function allNif(): Chain; + /** @return Chain */ public function allNip(): Chain; + /** @return Chain */ public function allNoneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function allNot(Validator $validator): Chain; + /** @return Chain */ public function allNullType(): Chain; + /** @return Chain */ public function allNumber(): Chain; + /** @return Chain */ public function allNumericVal(): Chain; + /** @return Chain */ public function allObjectType(): Chain; + /** @return Chain */ public function allOdd(): Chain; + /** @return Chain */ public function allOneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function allPesel(): Chain; + /** @return Chain */ public function allPhone(string|null $countryCode = null): Chain; + /** @return Chain */ public function allPis(): Chain; + /** @return Chain */ public function allPolishIdCard(): Chain; + /** @return Chain */ public function allPortugueseNif(): Chain; + /** @return Chain */ public function allPositive(): Chain; + /** @return Chain */ public function allPostalCode(string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public function allPrintable(string ...$additionalChars): Chain; + /** @return Chain */ public function allPublicDomainSuffix(): Chain; + /** @return Chain */ public function allPunct(string ...$additionalChars): Chain; + /** @return Chain */ public function allReadable(): Chain; + /** @return Chain */ public function allRegex(string $regex): Chain; + /** @return Chain */ public function allResourceType(): Chain; + /** @return Chain */ public function allRoman(): Chain; + /** @return Chain */ public function allSatisfies(callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public function allScalarVal(): Chain; + /** @return Chain */ public function allShortCircuit(Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public function allSize(string $unit, Validator $validator): Chain; + /** @return Chain */ public function allSlug(): Chain; + /** @return Chain */ public function allSorted(string $direction): Chain; + /** @return Chain */ public function allSpace(string ...$additionalChars): Chain; + /** @return Chain */ public function allSpaced(): Chain; + /** @return Chain */ public function allStartsWith(mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public function allStringType(): Chain; + /** @return Chain */ public function allStringVal(): Chain; + /** @return Chain */ public function allSubdivisionCode(string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public function allSubset(array $superset): Chain; + /** @return Chain */ public function allSymbolicLink(): Chain; + /** @return Chain */ public function allTime(string $format = 'H:i:s'): Chain; + /** @return Chain */ public function allTld(): Chain; + /** @return Chain */ public function allTrimmed(string ...$trimValues): Chain; + /** @return Chain */ public function allTrueVal(): Chain; + /** @return Chain */ public function allUndef(): Chain; + /** @return Chain */ public function allUnique(): Chain; + /** @return Chain */ public function allUppercase(): Chain; + /** @return Chain */ public function allUrl(): Chain; + /** @return Chain */ public function allUuid(int|null $version = null): Chain; + /** @return Chain */ public function allVersion(): Chain; + /** @return Chain */ public function allVowel(string ...$additionalChars): Chain; + /** @return Chain */ public function allWhen(Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public function allWritable(): Chain; + /** @return Chain */ public function allXdigit(string ...$additionalChars): Chain; } diff --git a/src/Mixins/Builder.php b/src/Mixins/Builder.php index 91e62fdbb..ee3b4e583 100644 --- a/src/Mixins/Builder.php +++ b/src/Mixins/Builder.php @@ -18,331 +18,523 @@ interface Builder extends AllBuilder, KeyBuilder, LengthBuilder, MaxBuilder, MinBuilder, NotBuilder, NullOrBuilder, PropertyBuilder, UndefOrBuilder { + /** @return Chain */ public static function after(callable $callable, Validator $validator): Chain; + /** + * @template T + * @param Chain $validator + * @return Chain> + */ public static function all(Validator $validator): Chain; + /** @return Chain */ public static function allOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function alnum(string ...$additionalChars): Chain; + /** @return Chain */ public static function alpha(string ...$additionalChars): Chain; + /** @return Chain */ public static function alwaysInvalid(): Chain; + /** @return Chain */ public static function alwaysValid(): Chain; + /** @return Chain */ public static function anyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function arrayType(): Chain; + /** @return Chain */ public static function arrayVal(): Chain; + /** @return Chain */ public static function attributes(): Chain; + /** @return Chain */ public static function base(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public static function base64(): Chain; + /** @return Chain */ public static function between(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public static function betweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public static function blank(): Chain; + /** @return Chain */ public static function boolType(): Chain; + /** @return Chain */ public static function boolVal(): Chain; + /** @return Chain */ public static function bsn(): Chain; + /** @return Chain */ public static function callableType(): Chain; + /** @return Chain */ public static function charset(string $charset, string ...$charsets): Chain; + /** @return Chain */ public static function cnh(): Chain; + /** @return Chain */ public static function cnpj(): Chain; + /** @return Chain */ public static function consonant(string ...$additionalChars): Chain; + /** @return Chain */ public static function contains(mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public static function containsAny(array $needles): Chain; + /** @return Chain */ public static function containsCount(mixed $containsValue, int $count): Chain; + /** @return Chain */ public static function control(string ...$additionalChars): Chain; + /** @return Chain */ public static function countable(): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public static function countryCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function cpf(): Chain; + /** @return Chain */ public static function creditCard(string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public static function currencyCode(string $set = 'alpha-3'): Chain; + /** @return Chain */ public static function date(string $format = 'Y-m-d'): Chain; + /** @return Chain */ public static function dateTime(string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public static function dateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public static function decimal(int $decimals): Chain; + /** @return Chain */ public static function digit(string ...$additionalChars): Chain; + /** @return Chain */ public static function directory(): Chain; + /** @return Chain */ public static function domain(bool $tldCheck = true): Chain; + /** + * @template T + * @param Chain $validator + * @return Chain> + */ public static function each(Validator $validator): Chain; + /** @return Chain */ public static function eachKey(Validator $validator): Chain; + /** @return Chain */ public static function email(): Chain; + /** @return Chain */ public static function emoji(): Chain; + /** @return Chain */ public static function endsWith(mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public static function equals(mixed $compareTo): Chain; + /** @return Chain */ public static function equivalent(mixed $compareTo): Chain; + /** @return Chain */ public static function even(): Chain; + /** @return Chain */ public static function executable(): Chain; + /** @return Chain */ public static function exists(): Chain; + /** @return Chain */ public static function extension(string $extension): Chain; + /** @return Chain */ public static function factor(int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public static function factory(callable $factory): Chain; + /** @return Chain */ public static function falseVal(): Chain; + /** @return Chain */ public static function falsy(): Chain; + /** @return Chain */ public static function file(): Chain; + /** @return Chain */ public static function finite(): Chain; + /** @return Chain */ public static function floatType(): Chain; + /** @return Chain */ public static function floatVal(): Chain; + /** @return Chain */ public static function format(Formatter $formatter): Chain; + /** @return Chain */ public static function formatted(Formatter $formatter, Validator $validator): Chain; + /** @return Chain */ public static function given(Validator $when, Validator $then): Chain; + /** @return Chain */ public static function graph(string ...$additionalChars): Chain; + /** @return Chain */ public static function greaterThan(mixed $compareTo): Chain; + /** @return Chain */ public static function greaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function hetu(): Chain; + /** @return Chain */ public static function hexRgbColor(): Chain; + /** @return Chain */ public static function iban(): Chain; + /** + * @template T + * @param T $compareTo + * @return Chain + */ public static function identical(mixed $compareTo): Chain; + /** @return Chain */ public static function image(): Chain; + /** @return Chain */ public static function imei(): Chain; + /** @return Chain */ public static function in(mixed $haystack): Chain; + /** @return Chain */ public static function infinite(): Chain; - /** @param class-string $class */ + /** + * @template T of object + * @param class-string $class + * @return Chain + */ public static function instance(string $class): Chain; + /** @return Chain */ public static function intType(): Chain; + /** @return Chain */ public static function intVal(): Chain; + /** @return Chain */ public static function ip(string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public static function isbn(): Chain; + /** @return Chain */ public static function iterableType(): Chain; + /** @return Chain */ public static function iterableVal(): Chain; + /** @return Chain */ public static function json(): Chain; + /** @return Chain */ public static function key(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function keyExists(int|string $key): Chain; + /** @return Chain */ public static function keyOptional(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function keySet(Validator $validator, Validator ...$validators): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public static function languageCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function leapDate(string $format): Chain; + /** @return Chain */ public static function leapYear(): Chain; + /** @return Chain */ public static function length(Validator $validator): Chain; + /** @return Chain */ public static function lessThan(mixed $compareTo): Chain; + /** @return Chain */ public static function lessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function lowercase(): Chain; + /** @return Chain */ public static function luhn(): Chain; + /** @return Chain */ public static function macAddress(): Chain; + /** @return Chain */ public static function max(Validator $validator): Chain; + /** @return Chain */ public static function mimetype(string $mimetype): Chain; + /** @return Chain */ public static function min(Validator $validator): Chain; + /** @return Chain */ public static function multiple(int $multipleOf): Chain; + /** @return Chain */ public static function named(Name|string $name, Validator $validator): Chain; + /** @return Chain */ public static function negative(): Chain; + /** @return Chain */ public static function nfeAccessKey(): Chain; + /** @return Chain */ public static function nif(): Chain; + /** @return Chain */ public static function nip(): Chain; + /** @return Chain */ public static function noneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function not(Validator $validator): Chain; + /** @return Chain */ public static function nullOr(Validator $validator): Chain; + /** @return Chain */ public static function nullType(): Chain; + /** @return Chain */ public static function number(): Chain; + /** @return Chain */ public static function numericVal(): Chain; + /** @return Chain */ public static function objectType(): Chain; + /** @return Chain */ public static function odd(): Chain; + /** @return Chain */ public static function oneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function pesel(): Chain; + /** @return Chain */ public static function phone(string|null $countryCode = null): Chain; + /** @return Chain */ public static function pis(): Chain; + /** @return Chain */ public static function polishIdCard(): Chain; + /** @return Chain */ public static function portugueseNif(): Chain; + /** @return Chain */ public static function positive(): Chain; + /** @return Chain */ public static function postalCode(string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public static function printable(string ...$additionalChars): Chain; + /** @return Chain */ public static function property(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function propertyExists(string $propertyName): Chain; + /** @return Chain */ public static function propertyOptional(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function publicDomainSuffix(): Chain; + /** @return Chain */ public static function punct(string ...$additionalChars): Chain; + /** @return Chain */ public static function readable(): Chain; + /** @return Chain */ public static function regex(string $regex): Chain; + /** @return Chain */ public static function resourceType(): Chain; + /** @return Chain */ public static function roman(): Chain; + /** @return Chain */ public static function satisfies(callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public static function scalarVal(): Chain; + /** @return Chain */ public static function shortCircuit(Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public static function size(string $unit, Validator $validator): Chain; + /** @return Chain */ public static function slug(): Chain; + /** @return Chain */ public static function sorted(string $direction): Chain; + /** @return Chain */ public static function space(string ...$additionalChars): Chain; + /** @return Chain */ public static function spaced(): Chain; + /** @return Chain */ public static function startsWith(mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public static function stringType(): Chain; + /** @return Chain */ public static function stringVal(): Chain; + /** @return Chain */ public static function subdivisionCode(string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public static function subset(array $superset): Chain; + /** @return Chain */ public static function symbolicLink(): Chain; - /** @param array $parameters */ + /** + * @param array $parameters + * @return Chain + */ public static function templated(string $template, Validator $validator, array $parameters = []): Chain; + /** @return Chain */ public static function time(string $format = 'H:i:s'): Chain; + /** @return Chain */ public static function tld(): Chain; + /** @return Chain */ public static function trimmed(string ...$trimValues): Chain; + /** @return Chain */ public static function trueVal(): Chain; + /** @return Chain */ public static function undef(): Chain; + /** @return Chain */ public static function undefOr(Validator $validator): Chain; + /** @return Chain */ public static function unique(): Chain; + /** @return Chain */ public static function uppercase(): Chain; + /** @return Chain */ public static function url(): Chain; + /** @return Chain */ public static function uuid(int|null $version = null): Chain; + /** @return Chain */ public static function version(): Chain; + /** @return Chain */ public static function vowel(string ...$additionalChars): Chain; + /** @return Chain */ public static function when(Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public static function writable(): Chain; + /** @return Chain */ public static function xdigit(string ...$additionalChars): Chain; } diff --git a/src/Mixins/Chain.php b/src/Mixins/Chain.php index ff1af3d40..94a73ffcf 100644 --- a/src/Mixins/Chain.php +++ b/src/Mixins/Chain.php @@ -17,334 +17,538 @@ use Respect\Validation\Validator; use Respect\Validation\ValidatorBuilder; -/** @mixin ValidatorBuilder */ +/** + * @template-covariant TSure + * @mixin ValidatorBuilder + */ interface Chain extends Validator, AllChain, KeyChain, LengthChain, MaxChain, MinChain, NotChain, NullOrChain, PropertyChain, UndefOrChain { + /** @return Chain */ public function after(callable $callable, Validator $validator): Chain; + /** + * @template T + * @param Chain $validator + * @return Chain> + */ public function all(Validator $validator): Chain; + /** @return Chain */ public function allOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function alnum(string ...$additionalChars): Chain; + /** @return Chain */ public function alpha(string ...$additionalChars): Chain; + /** @return Chain */ public function alwaysInvalid(): Chain; + /** @return Chain */ public function alwaysValid(): Chain; + /** @return Chain */ public function anyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function arrayType(): Chain; + /** @return Chain */ public function arrayVal(): Chain; + /** @return Chain */ public function attributes(): Chain; + /** @return Chain */ public function base(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public function base64(): Chain; + /** @return Chain */ public function between(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public function betweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public function blank(): Chain; + /** @return Chain */ public function boolType(): Chain; + /** @return Chain */ public function boolVal(): Chain; + /** @return Chain */ public function bsn(): Chain; + /** @return Chain */ public function callableType(): Chain; + /** @return Chain */ public function charset(string $charset, string ...$charsets): Chain; + /** @return Chain */ public function cnh(): Chain; + /** @return Chain */ public function cnpj(): Chain; + /** @return Chain */ public function consonant(string ...$additionalChars): Chain; + /** @return Chain */ public function contains(mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public function containsAny(array $needles): Chain; + /** @return Chain */ public function containsCount(mixed $containsValue, int $count): Chain; + /** @return Chain */ public function control(string ...$additionalChars): Chain; + /** @return Chain */ public function countable(): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public function countryCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public function cpf(): Chain; + /** @return Chain */ public function creditCard(string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public function currencyCode(string $set = 'alpha-3'): Chain; + /** @return Chain */ public function date(string $format = 'Y-m-d'): Chain; + /** @return Chain */ public function dateTime(string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public function dateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public function decimal(int $decimals): Chain; + /** @return Chain */ public function digit(string ...$additionalChars): Chain; + /** @return Chain */ public function directory(): Chain; + /** @return Chain */ public function domain(bool $tldCheck = true): Chain; + /** + * @template T + * @param Chain $validator + * @return Chain> + */ public function each(Validator $validator): Chain; + /** @return Chain */ public function eachKey(Validator $validator): Chain; + /** @return Chain */ public function email(): Chain; + /** @return Chain */ public function emoji(): Chain; + /** @return Chain */ public function endsWith(mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public function equals(mixed $compareTo): Chain; + /** @return Chain */ public function equivalent(mixed $compareTo): Chain; + /** @return Chain */ public function even(): Chain; + /** @return Chain */ public function executable(): Chain; + /** @return Chain */ public function exists(): Chain; + /** @return Chain */ public function extension(string $extension): Chain; + /** @return Chain */ public function factor(int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public function factory(callable $factory): Chain; + /** @return Chain */ public function falseVal(): Chain; + /** @return Chain */ public function falsy(): Chain; + /** @return Chain */ public function file(): Chain; + /** @return Chain */ public function finite(): Chain; + /** @return Chain */ public function floatType(): Chain; + /** @return Chain */ public function floatVal(): Chain; + /** @return Chain */ public function format(Formatter $formatter): Chain; + /** @return Chain */ public function formatted(Formatter $formatter, Validator $validator): Chain; + /** @return Chain */ public function given(Validator $when, Validator $then): Chain; + /** @return Chain */ public function graph(string ...$additionalChars): Chain; + /** @return Chain */ public function greaterThan(mixed $compareTo): Chain; + /** @return Chain */ public function greaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function hetu(): Chain; + /** @return Chain */ public function hexRgbColor(): Chain; + /** @return Chain */ public function iban(): Chain; + /** @return Chain */ public function identical(mixed $compareTo): Chain; + /** @return Chain */ public function image(): Chain; + /** @return Chain */ public function imei(): Chain; + /** @return Chain */ public function in(mixed $haystack): Chain; + /** @return Chain */ public function infinite(): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public function instance(string $class): Chain; + /** @return Chain */ public function intType(): Chain; + /** @return Chain */ public function intVal(): Chain; + /** @return Chain */ public function ip(string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public function isbn(): Chain; + /** @return Chain */ public function iterableType(): Chain; + /** @return Chain */ public function iterableVal(): Chain; + /** @return Chain */ public function json(): Chain; + /** @return Chain */ public function key(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function keyExists(int|string $key): Chain; + /** @return Chain */ public function keyOptional(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function keySet(Validator $validator, Validator ...$validators): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public function languageCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public function leapDate(string $format): Chain; + /** @return Chain */ public function leapYear(): Chain; + /** @return Chain */ public function length(Validator $validator): Chain; + /** @return Chain */ public function lessThan(mixed $compareTo): Chain; + /** @return Chain */ public function lessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function lowercase(): Chain; + /** @return Chain */ public function luhn(): Chain; + /** @return Chain */ public function macAddress(): Chain; + /** @return Chain */ public function max(Validator $validator): Chain; + /** @return Chain */ public function mimetype(string $mimetype): Chain; + /** @return Chain */ public function min(Validator $validator): Chain; + /** @return Chain */ public function multiple(int $multipleOf): Chain; + /** @return Chain */ public function named(Name|string $name, Validator $validator): Chain; + /** @return Chain */ public function negative(): Chain; + /** @return Chain */ public function nfeAccessKey(): Chain; + /** @return Chain */ public function nif(): Chain; + /** @return Chain */ public function nip(): Chain; + /** @return Chain */ public function noneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function not(Validator $validator): Chain; + /** @return Chain */ public function nullOr(Validator $validator): Chain; + /** @return Chain */ public function nullType(): Chain; + /** @return Chain */ public function number(): Chain; + /** @return Chain */ public function numericVal(): Chain; + /** @return Chain */ public function objectType(): Chain; + /** @return Chain */ public function odd(): Chain; + /** @return Chain */ public function oneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function pesel(): Chain; + /** @return Chain */ public function phone(string|null $countryCode = null): Chain; + /** @return Chain */ public function pis(): Chain; + /** @return Chain */ public function polishIdCard(): Chain; + /** @return Chain */ public function portugueseNif(): Chain; + /** @return Chain */ public function positive(): Chain; + /** @return Chain */ public function postalCode(string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public function printable(string ...$additionalChars): Chain; + /** @return Chain */ public function property(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function propertyExists(string $propertyName): Chain; + /** @return Chain */ public function propertyOptional(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function publicDomainSuffix(): Chain; + /** @return Chain */ public function punct(string ...$additionalChars): Chain; + /** @return Chain */ public function readable(): Chain; + /** @return Chain */ public function regex(string $regex): Chain; + /** @return Chain */ public function resourceType(): Chain; + /** @return Chain */ public function roman(): Chain; + /** @return Chain */ public function satisfies(callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public function scalarVal(): Chain; + /** @return Chain */ public function shortCircuit(Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public function size(string $unit, Validator $validator): Chain; + /** @return Chain */ public function slug(): Chain; + /** @return Chain */ public function sorted(string $direction): Chain; + /** @return Chain */ public function space(string ...$additionalChars): Chain; + /** @return Chain */ public function spaced(): Chain; + /** @return Chain */ public function startsWith(mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public function stringType(): Chain; + /** @return Chain */ public function stringVal(): Chain; + /** @return Chain */ public function subdivisionCode(string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public function subset(array $superset): Chain; + /** @return Chain */ public function symbolicLink(): Chain; - /** @param array $parameters */ + /** + * @param array $parameters + * @return Chain + */ public function templated(string $template, Validator $validator, array $parameters = []): Chain; + /** @return Chain */ public function time(string $format = 'H:i:s'): Chain; + /** @return Chain */ public function tld(): Chain; + /** @return Chain */ public function trimmed(string ...$trimValues): Chain; + /** @return Chain */ public function trueVal(): Chain; + /** @return Chain */ public function undef(): Chain; + /** @return Chain */ public function undefOr(Validator $validator): Chain; + /** @return Chain */ public function unique(): Chain; + /** @return Chain */ public function uppercase(): Chain; + /** @return Chain */ public function url(): Chain; + /** @return Chain */ public function uuid(int|null $version = null): Chain; + /** @return Chain */ public function version(): Chain; + /** @return Chain */ public function vowel(string ...$additionalChars): Chain; + /** @return Chain */ public function when(Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public function writable(): Chain; + /** @return Chain */ public function xdigit(string ...$additionalChars): Chain; + + /** + * @phpstan-assert TSure $input + * @psalm-assert TSure $input + */ + public function assert(mixed $input, mixed $template = null): void; + + /** + * @phpstan-assert TSure $input + * @psalm-assert TSure $input + */ + public function check(mixed $input, mixed $template = null): void; + + public function isValid(mixed $input): bool; } diff --git a/src/Mixins/KeyBuilder.php b/src/Mixins/KeyBuilder.php index 9a7288671..f2d781b4d 100644 --- a/src/Mixins/KeyBuilder.php +++ b/src/Mixins/KeyBuilder.php @@ -17,302 +17,465 @@ interface KeyBuilder { + /** @return Chain */ public static function keyAfter(int|string $key, callable $callable, Validator $validator): Chain; + /** @return Chain */ public static function keyAll(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function keyAllOf(int|string $key, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function keyAlnum(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public static function keyAlpha(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public static function keyAlwaysInvalid(int|string $key): Chain; + /** @return Chain */ public static function keyAlwaysValid(int|string $key): Chain; + /** @return Chain */ public static function keyAnyOf(int|string $key, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function keyArrayType(int|string $key): Chain; + /** @return Chain */ public static function keyArrayVal(int|string $key): Chain; + /** @return Chain */ public static function keyBase(int|string $key, int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public static function keyBase64(int|string $key): Chain; + /** @return Chain */ public static function keyBetween(int|string $key, mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public static function keyBetweenExclusive(int|string $key, mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public static function keyBlank(int|string $key): Chain; + /** @return Chain */ public static function keyBoolType(int|string $key): Chain; + /** @return Chain */ public static function keyBoolVal(int|string $key): Chain; + /** @return Chain */ public static function keyBsn(int|string $key): Chain; + /** @return Chain */ public static function keyCallableType(int|string $key): Chain; + /** @return Chain */ public static function keyCharset(int|string $key, string $charset, string ...$charsets): Chain; + /** @return Chain */ public static function keyCnh(int|string $key): Chain; + /** @return Chain */ public static function keyCnpj(int|string $key): Chain; + /** @return Chain */ public static function keyConsonant(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public static function keyContains(int|string $key, mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public static function keyContainsAny(int|string $key, array $needles): Chain; + /** @return Chain */ public static function keyContainsCount(int|string $key, mixed $containsValue, int $count): Chain; + /** @return Chain */ public static function keyControl(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public static function keyCountable(int|string $key): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public static function keyCountryCode(int|string $key, string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function keyCpf(int|string $key): Chain; + /** @return Chain */ public static function keyCreditCard(int|string $key, string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public static function keyCurrencyCode(int|string $key, string $set = 'alpha-3'): Chain; + /** @return Chain */ public static function keyDate(int|string $key, string $format = 'Y-m-d'): Chain; + /** @return Chain */ public static function keyDateTime(int|string $key, string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public static function keyDateTimeDiff(int|string $key, string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public static function keyDecimal(int|string $key, int $decimals): Chain; + /** @return Chain */ public static function keyDigit(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public static function keyDirectory(int|string $key): Chain; + /** @return Chain */ public static function keyDomain(int|string $key, bool $tldCheck = true): Chain; + /** @return Chain */ public static function keyEach(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function keyEachKey(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function keyEmail(int|string $key): Chain; + /** @return Chain */ public static function keyEmoji(int|string $key): Chain; + /** @return Chain */ public static function keyEndsWith(int|string $key, mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public static function keyEquals(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public static function keyEquivalent(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public static function keyEven(int|string $key): Chain; + /** @return Chain */ public static function keyExecutable(int|string $key): Chain; + /** @return Chain */ public static function keyExtension(int|string $key, string $extension): Chain; + /** @return Chain */ public static function keyFactor(int|string $key, int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public static function keyFactory(int|string $key, callable $factory): Chain; + /** @return Chain */ public static function keyFalseVal(int|string $key): Chain; + /** @return Chain */ public static function keyFalsy(int|string $key): Chain; + /** @return Chain */ public static function keyFile(int|string $key): Chain; + /** @return Chain */ public static function keyFinite(int|string $key): Chain; + /** @return Chain */ public static function keyFloatType(int|string $key): Chain; + /** @return Chain */ public static function keyFloatVal(int|string $key): Chain; + /** @return Chain */ public static function keyFormat(int|string $key, Formatter $formatter): Chain; + /** @return Chain */ public static function keyGiven(int|string $key, Validator $when, Validator $then): Chain; + /** @return Chain */ public static function keyGraph(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public static function keyGreaterThan(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public static function keyGreaterThanOrEqual(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public static function keyHetu(int|string $key): Chain; + /** @return Chain */ public static function keyHexRgbColor(int|string $key): Chain; + /** @return Chain */ public static function keyIban(int|string $key): Chain; + /** @return Chain */ public static function keyIdentical(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public static function keyImage(int|string $key): Chain; + /** @return Chain */ public static function keyImei(int|string $key): Chain; + /** @return Chain */ public static function keyIn(int|string $key, mixed $haystack): Chain; + /** @return Chain */ public static function keyInfinite(int|string $key): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public static function keyInstance(int|string $key, string $class): Chain; + /** @return Chain */ public static function keyIntType(int|string $key): Chain; + /** @return Chain */ public static function keyIntVal(int|string $key): Chain; + /** @return Chain */ public static function keyIp(int|string $key, string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public static function keyIsbn(int|string $key): Chain; + /** @return Chain */ public static function keyIterableType(int|string $key): Chain; + /** @return Chain */ public static function keyIterableVal(int|string $key): Chain; + /** @return Chain */ public static function keyJson(int|string $key): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public static function keyLanguageCode(int|string $key, string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function keyLeapDate(int|string $key, string $format): Chain; + /** @return Chain */ public static function keyLeapYear(int|string $key): Chain; + /** @return Chain */ public static function keyLength(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function keyLessThan(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public static function keyLessThanOrEqual(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public static function keyLowercase(int|string $key): Chain; + /** @return Chain */ public static function keyLuhn(int|string $key): Chain; + /** @return Chain */ public static function keyMacAddress(int|string $key): Chain; + /** @return Chain */ public static function keyMax(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function keyMimetype(int|string $key, string $mimetype): Chain; + /** @return Chain */ public static function keyMin(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function keyMultiple(int|string $key, int $multipleOf): Chain; + /** @return Chain */ public static function keyNegative(int|string $key): Chain; + /** @return Chain */ public static function keyNfeAccessKey(int|string $key): Chain; + /** @return Chain */ public static function keyNif(int|string $key): Chain; + /** @return Chain */ public static function keyNip(int|string $key): Chain; + /** @return Chain */ public static function keyNoneOf(int|string $key, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function keyNot(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function keyNullType(int|string $key): Chain; + /** @return Chain */ public static function keyNumber(int|string $key): Chain; + /** @return Chain */ public static function keyNumericVal(int|string $key): Chain; + /** @return Chain */ public static function keyObjectType(int|string $key): Chain; + /** @return Chain */ public static function keyOdd(int|string $key): Chain; + /** @return Chain */ public static function keyOneOf(int|string $key, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function keyPesel(int|string $key): Chain; + /** @return Chain */ public static function keyPhone(int|string $key, string|null $countryCode = null): Chain; + /** @return Chain */ public static function keyPis(int|string $key): Chain; + /** @return Chain */ public static function keyPolishIdCard(int|string $key): Chain; + /** @return Chain */ public static function keyPortugueseNif(int|string $key): Chain; + /** @return Chain */ public static function keyPositive(int|string $key): Chain; + /** @return Chain */ public static function keyPostalCode(int|string $key, string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public static function keyPrintable(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public static function keyPublicDomainSuffix(int|string $key): Chain; + /** @return Chain */ public static function keyPunct(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public static function keyReadable(int|string $key): Chain; + /** @return Chain */ public static function keyRegex(int|string $key, string $regex): Chain; + /** @return Chain */ public static function keyResourceType(int|string $key): Chain; + /** @return Chain */ public static function keyRoman(int|string $key): Chain; + /** @return Chain */ public static function keySatisfies(int|string $key, callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public static function keyScalarVal(int|string $key): Chain; + /** @return Chain */ public static function keyShortCircuit(int|string $key, Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public static function keySize(int|string $key, string $unit, Validator $validator): Chain; + /** @return Chain */ public static function keySlug(int|string $key): Chain; + /** @return Chain */ public static function keySorted(int|string $key, string $direction): Chain; + /** @return Chain */ public static function keySpace(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public static function keySpaced(int|string $key): Chain; + /** @return Chain */ public static function keyStartsWith(int|string $key, mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public static function keyStringType(int|string $key): Chain; + /** @return Chain */ public static function keyStringVal(int|string $key): Chain; + /** @return Chain */ public static function keySubdivisionCode(int|string $key, string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public static function keySubset(int|string $key, array $superset): Chain; + /** @return Chain */ public static function keySymbolicLink(int|string $key): Chain; + /** @return Chain */ public static function keyTime(int|string $key, string $format = 'H:i:s'): Chain; + /** @return Chain */ public static function keyTld(int|string $key): Chain; + /** @return Chain */ public static function keyTrimmed(int|string $key, string ...$trimValues): Chain; + /** @return Chain */ public static function keyTrueVal(int|string $key): Chain; + /** @return Chain */ public static function keyUndef(int|string $key): Chain; + /** @return Chain */ public static function keyUnique(int|string $key): Chain; + /** @return Chain */ public static function keyUppercase(int|string $key): Chain; + /** @return Chain */ public static function keyUrl(int|string $key): Chain; + /** @return Chain */ public static function keyUuid(int|string $key, int|null $version = null): Chain; + /** @return Chain */ public static function keyVersion(int|string $key): Chain; + /** @return Chain */ public static function keyVowel(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public static function keyWhen(int|string $key, Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public static function keyWritable(int|string $key): Chain; + /** @return Chain */ public static function keyXdigit(int|string $key, string ...$additionalChars): Chain; } diff --git a/src/Mixins/KeyChain.php b/src/Mixins/KeyChain.php index 43db07d08..76ae85a90 100644 --- a/src/Mixins/KeyChain.php +++ b/src/Mixins/KeyChain.php @@ -17,302 +17,465 @@ interface KeyChain { + /** @return Chain */ public function keyAfter(int|string $key, callable $callable, Validator $validator): Chain; + /** @return Chain */ public function keyAll(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function keyAllOf(int|string $key, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function keyAlnum(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public function keyAlpha(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public function keyAlwaysInvalid(int|string $key): Chain; + /** @return Chain */ public function keyAlwaysValid(int|string $key): Chain; + /** @return Chain */ public function keyAnyOf(int|string $key, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function keyArrayType(int|string $key): Chain; + /** @return Chain */ public function keyArrayVal(int|string $key): Chain; + /** @return Chain */ public function keyBase(int|string $key, int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public function keyBase64(int|string $key): Chain; + /** @return Chain */ public function keyBetween(int|string $key, mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public function keyBetweenExclusive(int|string $key, mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public function keyBlank(int|string $key): Chain; + /** @return Chain */ public function keyBoolType(int|string $key): Chain; + /** @return Chain */ public function keyBoolVal(int|string $key): Chain; + /** @return Chain */ public function keyBsn(int|string $key): Chain; + /** @return Chain */ public function keyCallableType(int|string $key): Chain; + /** @return Chain */ public function keyCharset(int|string $key, string $charset, string ...$charsets): Chain; + /** @return Chain */ public function keyCnh(int|string $key): Chain; + /** @return Chain */ public function keyCnpj(int|string $key): Chain; + /** @return Chain */ public function keyConsonant(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public function keyContains(int|string $key, mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public function keyContainsAny(int|string $key, array $needles): Chain; + /** @return Chain */ public function keyContainsCount(int|string $key, mixed $containsValue, int $count): Chain; + /** @return Chain */ public function keyControl(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public function keyCountable(int|string $key): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public function keyCountryCode(int|string $key, string $set = 'alpha-2'): Chain; + /** @return Chain */ public function keyCpf(int|string $key): Chain; + /** @return Chain */ public function keyCreditCard(int|string $key, string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public function keyCurrencyCode(int|string $key, string $set = 'alpha-3'): Chain; + /** @return Chain */ public function keyDate(int|string $key, string $format = 'Y-m-d'): Chain; + /** @return Chain */ public function keyDateTime(int|string $key, string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public function keyDateTimeDiff(int|string $key, string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public function keyDecimal(int|string $key, int $decimals): Chain; + /** @return Chain */ public function keyDigit(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public function keyDirectory(int|string $key): Chain; + /** @return Chain */ public function keyDomain(int|string $key, bool $tldCheck = true): Chain; + /** @return Chain */ public function keyEach(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function keyEachKey(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function keyEmail(int|string $key): Chain; + /** @return Chain */ public function keyEmoji(int|string $key): Chain; + /** @return Chain */ public function keyEndsWith(int|string $key, mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public function keyEquals(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public function keyEquivalent(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public function keyEven(int|string $key): Chain; + /** @return Chain */ public function keyExecutable(int|string $key): Chain; + /** @return Chain */ public function keyExtension(int|string $key, string $extension): Chain; + /** @return Chain */ public function keyFactor(int|string $key, int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public function keyFactory(int|string $key, callable $factory): Chain; + /** @return Chain */ public function keyFalseVal(int|string $key): Chain; + /** @return Chain */ public function keyFalsy(int|string $key): Chain; + /** @return Chain */ public function keyFile(int|string $key): Chain; + /** @return Chain */ public function keyFinite(int|string $key): Chain; + /** @return Chain */ public function keyFloatType(int|string $key): Chain; + /** @return Chain */ public function keyFloatVal(int|string $key): Chain; + /** @return Chain */ public function keyFormat(int|string $key, Formatter $formatter): Chain; + /** @return Chain */ public function keyGiven(int|string $key, Validator $when, Validator $then): Chain; + /** @return Chain */ public function keyGraph(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public function keyGreaterThan(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public function keyGreaterThanOrEqual(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public function keyHetu(int|string $key): Chain; + /** @return Chain */ public function keyHexRgbColor(int|string $key): Chain; + /** @return Chain */ public function keyIban(int|string $key): Chain; + /** @return Chain */ public function keyIdentical(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public function keyImage(int|string $key): Chain; + /** @return Chain */ public function keyImei(int|string $key): Chain; + /** @return Chain */ public function keyIn(int|string $key, mixed $haystack): Chain; + /** @return Chain */ public function keyInfinite(int|string $key): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public function keyInstance(int|string $key, string $class): Chain; + /** @return Chain */ public function keyIntType(int|string $key): Chain; + /** @return Chain */ public function keyIntVal(int|string $key): Chain; + /** @return Chain */ public function keyIp(int|string $key, string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public function keyIsbn(int|string $key): Chain; + /** @return Chain */ public function keyIterableType(int|string $key): Chain; + /** @return Chain */ public function keyIterableVal(int|string $key): Chain; + /** @return Chain */ public function keyJson(int|string $key): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public function keyLanguageCode(int|string $key, string $set = 'alpha-2'): Chain; + /** @return Chain */ public function keyLeapDate(int|string $key, string $format): Chain; + /** @return Chain */ public function keyLeapYear(int|string $key): Chain; + /** @return Chain */ public function keyLength(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function keyLessThan(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public function keyLessThanOrEqual(int|string $key, mixed $compareTo): Chain; + /** @return Chain */ public function keyLowercase(int|string $key): Chain; + /** @return Chain */ public function keyLuhn(int|string $key): Chain; + /** @return Chain */ public function keyMacAddress(int|string $key): Chain; + /** @return Chain */ public function keyMax(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function keyMimetype(int|string $key, string $mimetype): Chain; + /** @return Chain */ public function keyMin(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function keyMultiple(int|string $key, int $multipleOf): Chain; + /** @return Chain */ public function keyNegative(int|string $key): Chain; + /** @return Chain */ public function keyNfeAccessKey(int|string $key): Chain; + /** @return Chain */ public function keyNif(int|string $key): Chain; + /** @return Chain */ public function keyNip(int|string $key): Chain; + /** @return Chain */ public function keyNoneOf(int|string $key, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function keyNot(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function keyNullType(int|string $key): Chain; + /** @return Chain */ public function keyNumber(int|string $key): Chain; + /** @return Chain */ public function keyNumericVal(int|string $key): Chain; + /** @return Chain */ public function keyObjectType(int|string $key): Chain; + /** @return Chain */ public function keyOdd(int|string $key): Chain; + /** @return Chain */ public function keyOneOf(int|string $key, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function keyPesel(int|string $key): Chain; + /** @return Chain */ public function keyPhone(int|string $key, string|null $countryCode = null): Chain; + /** @return Chain */ public function keyPis(int|string $key): Chain; + /** @return Chain */ public function keyPolishIdCard(int|string $key): Chain; + /** @return Chain */ public function keyPortugueseNif(int|string $key): Chain; + /** @return Chain */ public function keyPositive(int|string $key): Chain; + /** @return Chain */ public function keyPostalCode(int|string $key, string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public function keyPrintable(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public function keyPublicDomainSuffix(int|string $key): Chain; + /** @return Chain */ public function keyPunct(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public function keyReadable(int|string $key): Chain; + /** @return Chain */ public function keyRegex(int|string $key, string $regex): Chain; + /** @return Chain */ public function keyResourceType(int|string $key): Chain; + /** @return Chain */ public function keyRoman(int|string $key): Chain; + /** @return Chain */ public function keySatisfies(int|string $key, callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public function keyScalarVal(int|string $key): Chain; + /** @return Chain */ public function keyShortCircuit(int|string $key, Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public function keySize(int|string $key, string $unit, Validator $validator): Chain; + /** @return Chain */ public function keySlug(int|string $key): Chain; + /** @return Chain */ public function keySorted(int|string $key, string $direction): Chain; + /** @return Chain */ public function keySpace(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public function keySpaced(int|string $key): Chain; + /** @return Chain */ public function keyStartsWith(int|string $key, mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public function keyStringType(int|string $key): Chain; + /** @return Chain */ public function keyStringVal(int|string $key): Chain; + /** @return Chain */ public function keySubdivisionCode(int|string $key, string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public function keySubset(int|string $key, array $superset): Chain; + /** @return Chain */ public function keySymbolicLink(int|string $key): Chain; + /** @return Chain */ public function keyTime(int|string $key, string $format = 'H:i:s'): Chain; + /** @return Chain */ public function keyTld(int|string $key): Chain; + /** @return Chain */ public function keyTrimmed(int|string $key, string ...$trimValues): Chain; + /** @return Chain */ public function keyTrueVal(int|string $key): Chain; + /** @return Chain */ public function keyUndef(int|string $key): Chain; + /** @return Chain */ public function keyUnique(int|string $key): Chain; + /** @return Chain */ public function keyUppercase(int|string $key): Chain; + /** @return Chain */ public function keyUrl(int|string $key): Chain; + /** @return Chain */ public function keyUuid(int|string $key, int|null $version = null): Chain; + /** @return Chain */ public function keyVersion(int|string $key): Chain; + /** @return Chain */ public function keyVowel(int|string $key, string ...$additionalChars): Chain; + /** @return Chain */ public function keyWhen(int|string $key, Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public function keyWritable(int|string $key): Chain; + /** @return Chain */ public function keyXdigit(int|string $key, string ...$additionalChars): Chain; } diff --git a/src/Mixins/LengthBuilder.php b/src/Mixins/LengthBuilder.php index 862f6429b..c44209868 100644 --- a/src/Mixins/LengthBuilder.php +++ b/src/Mixins/LengthBuilder.php @@ -13,37 +13,54 @@ interface LengthBuilder { + /** @return Chain */ public static function lengthBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public static function lengthBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public static function lengthEquals(mixed $compareTo): Chain; + /** @return Chain */ public static function lengthEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public static function lengthEven(): Chain; + /** @return Chain */ public static function lengthFactor(int $dividend): Chain; + /** @return Chain */ public static function lengthFinite(): Chain; + /** @return Chain */ public static function lengthGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public static function lengthGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function lengthIdentical(mixed $compareTo): Chain; + /** @return Chain */ public static function lengthIn(mixed $haystack): Chain; + /** @return Chain */ public static function lengthInfinite(): Chain; + /** @return Chain */ public static function lengthLessThan(mixed $compareTo): Chain; + /** @return Chain */ public static function lengthLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function lengthMultiple(int $multipleOf): Chain; + /** @return Chain */ public static function lengthOdd(): Chain; + /** @return Chain */ public static function lengthPositive(): Chain; } diff --git a/src/Mixins/LengthChain.php b/src/Mixins/LengthChain.php index 0fce34e70..b9b29d7ad 100644 --- a/src/Mixins/LengthChain.php +++ b/src/Mixins/LengthChain.php @@ -13,37 +13,54 @@ interface LengthChain { + /** @return Chain */ public function lengthBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public function lengthBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public function lengthEquals(mixed $compareTo): Chain; + /** @return Chain */ public function lengthEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public function lengthEven(): Chain; + /** @return Chain */ public function lengthFactor(int $dividend): Chain; + /** @return Chain */ public function lengthFinite(): Chain; + /** @return Chain */ public function lengthGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public function lengthGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function lengthIdentical(mixed $compareTo): Chain; + /** @return Chain */ public function lengthIn(mixed $haystack): Chain; + /** @return Chain */ public function lengthInfinite(): Chain; + /** @return Chain */ public function lengthLessThan(mixed $compareTo): Chain; + /** @return Chain */ public function lengthLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function lengthMultiple(int $multipleOf): Chain; + /** @return Chain */ public function lengthOdd(): Chain; + /** @return Chain */ public function lengthPositive(): Chain; } diff --git a/src/Mixins/MaxBuilder.php b/src/Mixins/MaxBuilder.php index a1d72098c..006baa49d 100644 --- a/src/Mixins/MaxBuilder.php +++ b/src/Mixins/MaxBuilder.php @@ -13,37 +13,54 @@ interface MaxBuilder { + /** @return Chain */ public static function maxBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public static function maxBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public static function maxEquals(mixed $compareTo): Chain; + /** @return Chain */ public static function maxEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public static function maxEven(): Chain; + /** @return Chain */ public static function maxFactor(int $dividend): Chain; + /** @return Chain */ public static function maxFinite(): Chain; + /** @return Chain */ public static function maxGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public static function maxGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function maxIdentical(mixed $compareTo): Chain; + /** @return Chain */ public static function maxIn(mixed $haystack): Chain; + /** @return Chain */ public static function maxInfinite(): Chain; + /** @return Chain */ public static function maxLessThan(mixed $compareTo): Chain; + /** @return Chain */ public static function maxLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function maxMultiple(int $multipleOf): Chain; + /** @return Chain */ public static function maxOdd(): Chain; + /** @return Chain */ public static function maxPositive(): Chain; } diff --git a/src/Mixins/MaxChain.php b/src/Mixins/MaxChain.php index 09bb6a005..c88609bf4 100644 --- a/src/Mixins/MaxChain.php +++ b/src/Mixins/MaxChain.php @@ -13,37 +13,54 @@ interface MaxChain { + /** @return Chain */ public function maxBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public function maxBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public function maxEquals(mixed $compareTo): Chain; + /** @return Chain */ public function maxEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public function maxEven(): Chain; + /** @return Chain */ public function maxFactor(int $dividend): Chain; + /** @return Chain */ public function maxFinite(): Chain; + /** @return Chain */ public function maxGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public function maxGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function maxIdentical(mixed $compareTo): Chain; + /** @return Chain */ public function maxIn(mixed $haystack): Chain; + /** @return Chain */ public function maxInfinite(): Chain; + /** @return Chain */ public function maxLessThan(mixed $compareTo): Chain; + /** @return Chain */ public function maxLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function maxMultiple(int $multipleOf): Chain; + /** @return Chain */ public function maxOdd(): Chain; + /** @return Chain */ public function maxPositive(): Chain; } diff --git a/src/Mixins/MinBuilder.php b/src/Mixins/MinBuilder.php index 7b9756d6a..42a1d1a53 100644 --- a/src/Mixins/MinBuilder.php +++ b/src/Mixins/MinBuilder.php @@ -13,37 +13,54 @@ interface MinBuilder { + /** @return Chain */ public static function minBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public static function minBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public static function minEquals(mixed $compareTo): Chain; + /** @return Chain */ public static function minEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public static function minEven(): Chain; + /** @return Chain */ public static function minFactor(int $dividend): Chain; + /** @return Chain */ public static function minFinite(): Chain; + /** @return Chain */ public static function minGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public static function minGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function minIdentical(mixed $compareTo): Chain; + /** @return Chain */ public static function minIn(mixed $haystack): Chain; + /** @return Chain */ public static function minInfinite(): Chain; + /** @return Chain */ public static function minLessThan(mixed $compareTo): Chain; + /** @return Chain */ public static function minLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function minMultiple(int $multipleOf): Chain; + /** @return Chain */ public static function minOdd(): Chain; + /** @return Chain */ public static function minPositive(): Chain; } diff --git a/src/Mixins/MinChain.php b/src/Mixins/MinChain.php index 6dc1f4d58..24b2c79db 100644 --- a/src/Mixins/MinChain.php +++ b/src/Mixins/MinChain.php @@ -13,37 +13,54 @@ interface MinChain { + /** @return Chain */ public function minBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public function minBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public function minEquals(mixed $compareTo): Chain; + /** @return Chain */ public function minEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public function minEven(): Chain; + /** @return Chain */ public function minFactor(int $dividend): Chain; + /** @return Chain */ public function minFinite(): Chain; + /** @return Chain */ public function minGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public function minGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function minIdentical(mixed $compareTo): Chain; + /** @return Chain */ public function minIn(mixed $haystack): Chain; + /** @return Chain */ public function minInfinite(): Chain; + /** @return Chain */ public function minLessThan(mixed $compareTo): Chain; + /** @return Chain */ public function minLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function minMultiple(int $multipleOf): Chain; + /** @return Chain */ public function minOdd(): Chain; + /** @return Chain */ public function minPositive(): Chain; } diff --git a/src/Mixins/NotBuilder.php b/src/Mixins/NotBuilder.php index 64ac26de7..8b8ce2fe8 100644 --- a/src/Mixins/NotBuilder.php +++ b/src/Mixins/NotBuilder.php @@ -17,318 +17,489 @@ interface NotBuilder { + /** @return Chain */ public static function notAfter(callable $callable, Validator $validator): Chain; + /** @return Chain */ public static function notAll(Validator $validator): Chain; + /** @return Chain */ public static function notAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function notAlnum(string ...$additionalChars): Chain; + /** @return Chain */ public static function notAlpha(string ...$additionalChars): Chain; + /** @return Chain */ public static function notAlwaysInvalid(): Chain; + /** @return Chain */ public static function notAlwaysValid(): Chain; + /** @return Chain */ public static function notAnyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function notArrayType(): Chain; + /** @return Chain */ public static function notArrayVal(): Chain; + /** @return Chain */ public static function notBase(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public static function notBase64(): Chain; + /** @return Chain */ public static function notBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public static function notBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public static function notBlank(): Chain; + /** @return Chain */ public static function notBoolType(): Chain; + /** @return Chain */ public static function notBoolVal(): Chain; + /** @return Chain */ public static function notBsn(): Chain; + /** @return Chain */ public static function notCallableType(): Chain; + /** @return Chain */ public static function notCharset(string $charset, string ...$charsets): Chain; + /** @return Chain */ public static function notCnh(): Chain; + /** @return Chain */ public static function notCnpj(): Chain; + /** @return Chain */ public static function notConsonant(string ...$additionalChars): Chain; + /** @return Chain */ public static function notContains(mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public static function notContainsAny(array $needles): Chain; + /** @return Chain */ public static function notContainsCount(mixed $containsValue, int $count): Chain; + /** @return Chain */ public static function notControl(string ...$additionalChars): Chain; + /** @return Chain */ public static function notCountable(): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public static function notCountryCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function notCpf(): Chain; + /** @return Chain */ public static function notCreditCard(string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public static function notCurrencyCode(string $set = 'alpha-3'): Chain; + /** @return Chain */ public static function notDate(string $format = 'Y-m-d'): Chain; + /** @return Chain */ public static function notDateTime(string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public static function notDateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public static function notDecimal(int $decimals): Chain; + /** @return Chain */ public static function notDigit(string ...$additionalChars): Chain; + /** @return Chain */ public static function notDirectory(): Chain; + /** @return Chain */ public static function notDomain(bool $tldCheck = true): Chain; + /** @return Chain */ public static function notEach(Validator $validator): Chain; + /** @return Chain */ public static function notEachKey(Validator $validator): Chain; + /** @return Chain */ public static function notEmail(): Chain; + /** @return Chain */ public static function notEmoji(): Chain; + /** @return Chain */ public static function notEndsWith(mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public static function notEquals(mixed $compareTo): Chain; + /** @return Chain */ public static function notEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public static function notEven(): Chain; + /** @return Chain */ public static function notExecutable(): Chain; + /** @return Chain */ public static function notExists(): Chain; + /** @return Chain */ public static function notExtension(string $extension): Chain; + /** @return Chain */ public static function notFactor(int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public static function notFactory(callable $factory): Chain; + /** @return Chain */ public static function notFalseVal(): Chain; + /** @return Chain */ public static function notFalsy(): Chain; + /** @return Chain */ public static function notFile(): Chain; + /** @return Chain */ public static function notFinite(): Chain; + /** @return Chain */ public static function notFloatType(): Chain; + /** @return Chain */ public static function notFloatVal(): Chain; + /** @return Chain */ public static function notFormat(Formatter $formatter): Chain; + /** @return Chain */ public static function notFormatted(Formatter $formatter, Validator $validator): Chain; + /** @return Chain */ public static function notGiven(Validator $when, Validator $then): Chain; + /** @return Chain */ public static function notGraph(string ...$additionalChars): Chain; + /** @return Chain */ public static function notGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public static function notGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function notHetu(): Chain; + /** @return Chain */ public static function notHexRgbColor(): Chain; + /** @return Chain */ public static function notIban(): Chain; + /** @return Chain */ public static function notIdentical(mixed $compareTo): Chain; + /** @return Chain */ public static function notImage(): Chain; + /** @return Chain */ public static function notImei(): Chain; + /** @return Chain */ public static function notIn(mixed $haystack): Chain; + /** @return Chain */ public static function notInfinite(): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public static function notInstance(string $class): Chain; + /** @return Chain */ public static function notIntType(): Chain; + /** @return Chain */ public static function notIntVal(): Chain; + /** @return Chain */ public static function notIp(string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public static function notIsbn(): Chain; + /** @return Chain */ public static function notIterableType(): Chain; + /** @return Chain */ public static function notIterableVal(): Chain; + /** @return Chain */ public static function notJson(): Chain; + /** @return Chain */ public static function notKey(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function notKeyExists(int|string $key): Chain; + /** @return Chain */ public static function notKeyOptional(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function notKeySet(Validator $validator, Validator ...$validators): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public static function notLanguageCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function notLeapDate(string $format): Chain; + /** @return Chain */ public static function notLeapYear(): Chain; + /** @return Chain */ public static function notLength(Validator $validator): Chain; + /** @return Chain */ public static function notLessThan(mixed $compareTo): Chain; + /** @return Chain */ public static function notLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function notLowercase(): Chain; + /** @return Chain */ public static function notLuhn(): Chain; + /** @return Chain */ public static function notMacAddress(): Chain; + /** @return Chain */ public static function notMax(Validator $validator): Chain; + /** @return Chain */ public static function notMimetype(string $mimetype): Chain; + /** @return Chain */ public static function notMin(Validator $validator): Chain; + /** @return Chain */ public static function notMultiple(int $multipleOf): Chain; + /** @return Chain */ public static function notNegative(): Chain; + /** @return Chain */ public static function notNfeAccessKey(): Chain; + /** @return Chain */ public static function notNif(): Chain; + /** @return Chain */ public static function notNip(): Chain; + /** @return Chain */ public static function notNoneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function notNullType(): Chain; + /** @return Chain */ public static function notNumber(): Chain; + /** @return Chain */ public static function notNumericVal(): Chain; + /** @return Chain */ public static function notObjectType(): Chain; + /** @return Chain */ public static function notOdd(): Chain; + /** @return Chain */ public static function notOneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function notPesel(): Chain; + /** @return Chain */ public static function notPhone(string|null $countryCode = null): Chain; + /** @return Chain */ public static function notPis(): Chain; + /** @return Chain */ public static function notPolishIdCard(): Chain; + /** @return Chain */ public static function notPortugueseNif(): Chain; + /** @return Chain */ public static function notPositive(): Chain; + /** @return Chain */ public static function notPostalCode(string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public static function notPrintable(string ...$additionalChars): Chain; + /** @return Chain */ public static function notProperty(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function notPropertyExists(string $propertyName): Chain; + /** @return Chain */ public static function notPropertyOptional(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function notPublicDomainSuffix(): Chain; + /** @return Chain */ public static function notPunct(string ...$additionalChars): Chain; + /** @return Chain */ public static function notReadable(): Chain; + /** @return Chain */ public static function notRegex(string $regex): Chain; + /** @return Chain */ public static function notResourceType(): Chain; + /** @return Chain */ public static function notRoman(): Chain; + /** @return Chain */ public static function notSatisfies(callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public static function notScalarVal(): Chain; + /** @return Chain */ public static function notShortCircuit(Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public static function notSize(string $unit, Validator $validator): Chain; + /** @return Chain */ public static function notSlug(): Chain; + /** @return Chain */ public static function notSorted(string $direction): Chain; + /** @return Chain */ public static function notSpace(string ...$additionalChars): Chain; + /** @return Chain */ public static function notSpaced(): Chain; + /** @return Chain */ public static function notStartsWith(mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public static function notStringType(): Chain; + /** @return Chain */ public static function notStringVal(): Chain; + /** @return Chain */ public static function notSubdivisionCode(string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public static function notSubset(array $superset): Chain; + /** @return Chain */ public static function notSymbolicLink(): Chain; + /** @return Chain */ public static function notTime(string $format = 'H:i:s'): Chain; + /** @return Chain */ public static function notTld(): Chain; + /** @return Chain */ public static function notTrimmed(string ...$trimValues): Chain; + /** @return Chain */ public static function notTrueVal(): Chain; + /** @return Chain */ public static function notUndef(): Chain; + /** @return Chain */ public static function notUnique(): Chain; + /** @return Chain */ public static function notUppercase(): Chain; + /** @return Chain */ public static function notUrl(): Chain; + /** @return Chain */ public static function notUuid(int|null $version = null): Chain; + /** @return Chain */ public static function notVersion(): Chain; + /** @return Chain */ public static function notVowel(string ...$additionalChars): Chain; + /** @return Chain */ public static function notWhen(Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public static function notWritable(): Chain; + /** @return Chain */ public static function notXdigit(string ...$additionalChars): Chain; } diff --git a/src/Mixins/NotChain.php b/src/Mixins/NotChain.php index 1e057b779..4f12826fc 100644 --- a/src/Mixins/NotChain.php +++ b/src/Mixins/NotChain.php @@ -17,318 +17,489 @@ interface NotChain { + /** @return Chain */ public function notAfter(callable $callable, Validator $validator): Chain; + /** @return Chain */ public function notAll(Validator $validator): Chain; + /** @return Chain */ public function notAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function notAlnum(string ...$additionalChars): Chain; + /** @return Chain */ public function notAlpha(string ...$additionalChars): Chain; + /** @return Chain */ public function notAlwaysInvalid(): Chain; + /** @return Chain */ public function notAlwaysValid(): Chain; + /** @return Chain */ public function notAnyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function notArrayType(): Chain; + /** @return Chain */ public function notArrayVal(): Chain; + /** @return Chain */ public function notBase(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public function notBase64(): Chain; + /** @return Chain */ public function notBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public function notBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public function notBlank(): Chain; + /** @return Chain */ public function notBoolType(): Chain; + /** @return Chain */ public function notBoolVal(): Chain; + /** @return Chain */ public function notBsn(): Chain; + /** @return Chain */ public function notCallableType(): Chain; + /** @return Chain */ public function notCharset(string $charset, string ...$charsets): Chain; + /** @return Chain */ public function notCnh(): Chain; + /** @return Chain */ public function notCnpj(): Chain; + /** @return Chain */ public function notConsonant(string ...$additionalChars): Chain; + /** @return Chain */ public function notContains(mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public function notContainsAny(array $needles): Chain; + /** @return Chain */ public function notContainsCount(mixed $containsValue, int $count): Chain; + /** @return Chain */ public function notControl(string ...$additionalChars): Chain; + /** @return Chain */ public function notCountable(): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public function notCountryCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public function notCpf(): Chain; + /** @return Chain */ public function notCreditCard(string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public function notCurrencyCode(string $set = 'alpha-3'): Chain; + /** @return Chain */ public function notDate(string $format = 'Y-m-d'): Chain; + /** @return Chain */ public function notDateTime(string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public function notDateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public function notDecimal(int $decimals): Chain; + /** @return Chain */ public function notDigit(string ...$additionalChars): Chain; + /** @return Chain */ public function notDirectory(): Chain; + /** @return Chain */ public function notDomain(bool $tldCheck = true): Chain; + /** @return Chain */ public function notEach(Validator $validator): Chain; + /** @return Chain */ public function notEachKey(Validator $validator): Chain; + /** @return Chain */ public function notEmail(): Chain; + /** @return Chain */ public function notEmoji(): Chain; + /** @return Chain */ public function notEndsWith(mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public function notEquals(mixed $compareTo): Chain; + /** @return Chain */ public function notEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public function notEven(): Chain; + /** @return Chain */ public function notExecutable(): Chain; + /** @return Chain */ public function notExists(): Chain; + /** @return Chain */ public function notExtension(string $extension): Chain; + /** @return Chain */ public function notFactor(int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public function notFactory(callable $factory): Chain; + /** @return Chain */ public function notFalseVal(): Chain; + /** @return Chain */ public function notFalsy(): Chain; + /** @return Chain */ public function notFile(): Chain; + /** @return Chain */ public function notFinite(): Chain; + /** @return Chain */ public function notFloatType(): Chain; + /** @return Chain */ public function notFloatVal(): Chain; + /** @return Chain */ public function notFormat(Formatter $formatter): Chain; + /** @return Chain */ public function notFormatted(Formatter $formatter, Validator $validator): Chain; + /** @return Chain */ public function notGiven(Validator $when, Validator $then): Chain; + /** @return Chain */ public function notGraph(string ...$additionalChars): Chain; + /** @return Chain */ public function notGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public function notGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function notHetu(): Chain; + /** @return Chain */ public function notHexRgbColor(): Chain; + /** @return Chain */ public function notIban(): Chain; + /** @return Chain */ public function notIdentical(mixed $compareTo): Chain; + /** @return Chain */ public function notImage(): Chain; + /** @return Chain */ public function notImei(): Chain; + /** @return Chain */ public function notIn(mixed $haystack): Chain; + /** @return Chain */ public function notInfinite(): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public function notInstance(string $class): Chain; + /** @return Chain */ public function notIntType(): Chain; + /** @return Chain */ public function notIntVal(): Chain; + /** @return Chain */ public function notIp(string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public function notIsbn(): Chain; + /** @return Chain */ public function notIterableType(): Chain; + /** @return Chain */ public function notIterableVal(): Chain; + /** @return Chain */ public function notJson(): Chain; + /** @return Chain */ public function notKey(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function notKeyExists(int|string $key): Chain; + /** @return Chain */ public function notKeyOptional(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function notKeySet(Validator $validator, Validator ...$validators): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public function notLanguageCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public function notLeapDate(string $format): Chain; + /** @return Chain */ public function notLeapYear(): Chain; + /** @return Chain */ public function notLength(Validator $validator): Chain; + /** @return Chain */ public function notLessThan(mixed $compareTo): Chain; + /** @return Chain */ public function notLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function notLowercase(): Chain; + /** @return Chain */ public function notLuhn(): Chain; + /** @return Chain */ public function notMacAddress(): Chain; + /** @return Chain */ public function notMax(Validator $validator): Chain; + /** @return Chain */ public function notMimetype(string $mimetype): Chain; + /** @return Chain */ public function notMin(Validator $validator): Chain; + /** @return Chain */ public function notMultiple(int $multipleOf): Chain; + /** @return Chain */ public function notNegative(): Chain; + /** @return Chain */ public function notNfeAccessKey(): Chain; + /** @return Chain */ public function notNif(): Chain; + /** @return Chain */ public function notNip(): Chain; + /** @return Chain */ public function notNoneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function notNullType(): Chain; + /** @return Chain */ public function notNumber(): Chain; + /** @return Chain */ public function notNumericVal(): Chain; + /** @return Chain */ public function notObjectType(): Chain; + /** @return Chain */ public function notOdd(): Chain; + /** @return Chain */ public function notOneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function notPesel(): Chain; + /** @return Chain */ public function notPhone(string|null $countryCode = null): Chain; + /** @return Chain */ public function notPis(): Chain; + /** @return Chain */ public function notPolishIdCard(): Chain; + /** @return Chain */ public function notPortugueseNif(): Chain; + /** @return Chain */ public function notPositive(): Chain; + /** @return Chain */ public function notPostalCode(string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public function notPrintable(string ...$additionalChars): Chain; + /** @return Chain */ public function notProperty(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function notPropertyExists(string $propertyName): Chain; + /** @return Chain */ public function notPropertyOptional(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function notPublicDomainSuffix(): Chain; + /** @return Chain */ public function notPunct(string ...$additionalChars): Chain; + /** @return Chain */ public function notReadable(): Chain; + /** @return Chain */ public function notRegex(string $regex): Chain; + /** @return Chain */ public function notResourceType(): Chain; + /** @return Chain */ public function notRoman(): Chain; + /** @return Chain */ public function notSatisfies(callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public function notScalarVal(): Chain; + /** @return Chain */ public function notShortCircuit(Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public function notSize(string $unit, Validator $validator): Chain; + /** @return Chain */ public function notSlug(): Chain; + /** @return Chain */ public function notSorted(string $direction): Chain; + /** @return Chain */ public function notSpace(string ...$additionalChars): Chain; + /** @return Chain */ public function notSpaced(): Chain; + /** @return Chain */ public function notStartsWith(mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public function notStringType(): Chain; + /** @return Chain */ public function notStringVal(): Chain; + /** @return Chain */ public function notSubdivisionCode(string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public function notSubset(array $superset): Chain; + /** @return Chain */ public function notSymbolicLink(): Chain; + /** @return Chain */ public function notTime(string $format = 'H:i:s'): Chain; + /** @return Chain */ public function notTld(): Chain; + /** @return Chain */ public function notTrimmed(string ...$trimValues): Chain; + /** @return Chain */ public function notTrueVal(): Chain; + /** @return Chain */ public function notUndef(): Chain; + /** @return Chain */ public function notUnique(): Chain; + /** @return Chain */ public function notUppercase(): Chain; + /** @return Chain */ public function notUrl(): Chain; + /** @return Chain */ public function notUuid(int|null $version = null): Chain; + /** @return Chain */ public function notVersion(): Chain; + /** @return Chain */ public function notVowel(string ...$additionalChars): Chain; + /** @return Chain */ public function notWhen(Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public function notWritable(): Chain; + /** @return Chain */ public function notXdigit(string ...$additionalChars): Chain; } diff --git a/src/Mixins/NullOrBuilder.php b/src/Mixins/NullOrBuilder.php index 2e1937052..9bda9ae6f 100644 --- a/src/Mixins/NullOrBuilder.php +++ b/src/Mixins/NullOrBuilder.php @@ -17,318 +17,489 @@ interface NullOrBuilder { + /** @return Chain */ public static function nullOrAfter(callable $callable, Validator $validator): Chain; + /** @return Chain */ public static function nullOrAll(Validator $validator): Chain; + /** @return Chain */ public static function nullOrAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function nullOrAlnum(string ...$additionalChars): Chain; + /** @return Chain */ public static function nullOrAlpha(string ...$additionalChars): Chain; + /** @return Chain */ public static function nullOrAlwaysInvalid(): Chain; + /** @return Chain */ public static function nullOrAlwaysValid(): Chain; + /** @return Chain */ public static function nullOrAnyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function nullOrArrayType(): Chain; + /** @return Chain */ public static function nullOrArrayVal(): Chain; + /** @return Chain */ public static function nullOrAttributes(): Chain; + /** @return Chain */ public static function nullOrBase(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public static function nullOrBase64(): Chain; + /** @return Chain */ public static function nullOrBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public static function nullOrBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public static function nullOrBoolType(): Chain; + /** @return Chain */ public static function nullOrBoolVal(): Chain; + /** @return Chain */ public static function nullOrBsn(): Chain; + /** @return Chain */ public static function nullOrCallableType(): Chain; + /** @return Chain */ public static function nullOrCharset(string $charset, string ...$charsets): Chain; + /** @return Chain */ public static function nullOrCnh(): Chain; + /** @return Chain */ public static function nullOrCnpj(): Chain; + /** @return Chain */ public static function nullOrConsonant(string ...$additionalChars): Chain; + /** @return Chain */ public static function nullOrContains(mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public static function nullOrContainsAny(array $needles): Chain; + /** @return Chain */ public static function nullOrContainsCount(mixed $containsValue, int $count): Chain; + /** @return Chain */ public static function nullOrControl(string ...$additionalChars): Chain; + /** @return Chain */ public static function nullOrCountable(): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public static function nullOrCountryCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function nullOrCpf(): Chain; + /** @return Chain */ public static function nullOrCreditCard(string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public static function nullOrCurrencyCode(string $set = 'alpha-3'): Chain; + /** @return Chain */ public static function nullOrDate(string $format = 'Y-m-d'): Chain; + /** @return Chain */ public static function nullOrDateTime(string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public static function nullOrDateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public static function nullOrDecimal(int $decimals): Chain; + /** @return Chain */ public static function nullOrDigit(string ...$additionalChars): Chain; + /** @return Chain */ public static function nullOrDirectory(): Chain; + /** @return Chain */ public static function nullOrDomain(bool $tldCheck = true): Chain; + /** @return Chain */ public static function nullOrEach(Validator $validator): Chain; + /** @return Chain */ public static function nullOrEachKey(Validator $validator): Chain; + /** @return Chain */ public static function nullOrEmail(): Chain; + /** @return Chain */ public static function nullOrEmoji(): Chain; + /** @return Chain */ public static function nullOrEndsWith(mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public static function nullOrEquals(mixed $compareTo): Chain; + /** @return Chain */ public static function nullOrEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public static function nullOrEven(): Chain; + /** @return Chain */ public static function nullOrExecutable(): Chain; + /** @return Chain */ public static function nullOrExists(): Chain; + /** @return Chain */ public static function nullOrExtension(string $extension): Chain; + /** @return Chain */ public static function nullOrFactor(int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public static function nullOrFactory(callable $factory): Chain; + /** @return Chain */ public static function nullOrFalseVal(): Chain; + /** @return Chain */ public static function nullOrFalsy(): Chain; + /** @return Chain */ public static function nullOrFile(): Chain; + /** @return Chain */ public static function nullOrFinite(): Chain; + /** @return Chain */ public static function nullOrFloatType(): Chain; + /** @return Chain */ public static function nullOrFloatVal(): Chain; + /** @return Chain */ public static function nullOrFormat(Formatter $formatter): Chain; + /** @return Chain */ public static function nullOrFormatted(Formatter $formatter, Validator $validator): Chain; + /** @return Chain */ public static function nullOrGiven(Validator $when, Validator $then): Chain; + /** @return Chain */ public static function nullOrGraph(string ...$additionalChars): Chain; + /** @return Chain */ public static function nullOrGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public static function nullOrGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function nullOrHetu(): Chain; + /** @return Chain */ public static function nullOrHexRgbColor(): Chain; + /** @return Chain */ public static function nullOrIban(): Chain; + /** @return Chain */ public static function nullOrIdentical(mixed $compareTo): Chain; + /** @return Chain */ public static function nullOrImage(): Chain; + /** @return Chain */ public static function nullOrImei(): Chain; + /** @return Chain */ public static function nullOrIn(mixed $haystack): Chain; + /** @return Chain */ public static function nullOrInfinite(): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public static function nullOrInstance(string $class): Chain; + /** @return Chain */ public static function nullOrIntType(): Chain; + /** @return Chain */ public static function nullOrIntVal(): Chain; + /** @return Chain */ public static function nullOrIp(string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public static function nullOrIsbn(): Chain; + /** @return Chain */ public static function nullOrIterableType(): Chain; + /** @return Chain */ public static function nullOrIterableVal(): Chain; + /** @return Chain */ public static function nullOrJson(): Chain; + /** @return Chain */ public static function nullOrKey(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function nullOrKeyExists(int|string $key): Chain; + /** @return Chain */ public static function nullOrKeyOptional(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function nullOrKeySet(Validator $validator, Validator ...$validators): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public static function nullOrLanguageCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function nullOrLeapDate(string $format): Chain; + /** @return Chain */ public static function nullOrLeapYear(): Chain; + /** @return Chain */ public static function nullOrLength(Validator $validator): Chain; + /** @return Chain */ public static function nullOrLessThan(mixed $compareTo): Chain; + /** @return Chain */ public static function nullOrLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function nullOrLowercase(): Chain; + /** @return Chain */ public static function nullOrLuhn(): Chain; + /** @return Chain */ public static function nullOrMacAddress(): Chain; + /** @return Chain */ public static function nullOrMax(Validator $validator): Chain; + /** @return Chain */ public static function nullOrMimetype(string $mimetype): Chain; + /** @return Chain */ public static function nullOrMin(Validator $validator): Chain; + /** @return Chain */ public static function nullOrMultiple(int $multipleOf): Chain; + /** @return Chain */ public static function nullOrNegative(): Chain; + /** @return Chain */ public static function nullOrNfeAccessKey(): Chain; + /** @return Chain */ public static function nullOrNif(): Chain; + /** @return Chain */ public static function nullOrNip(): Chain; + /** @return Chain */ public static function nullOrNoneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function nullOrNot(Validator $validator): Chain; + /** @return Chain */ public static function nullOrNullType(): Chain; + /** @return Chain */ public static function nullOrNumber(): Chain; + /** @return Chain */ public static function nullOrNumericVal(): Chain; + /** @return Chain */ public static function nullOrObjectType(): Chain; + /** @return Chain */ public static function nullOrOdd(): Chain; + /** @return Chain */ public static function nullOrOneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function nullOrPesel(): Chain; + /** @return Chain */ public static function nullOrPhone(string|null $countryCode = null): Chain; + /** @return Chain */ public static function nullOrPis(): Chain; + /** @return Chain */ public static function nullOrPolishIdCard(): Chain; + /** @return Chain */ public static function nullOrPortugueseNif(): Chain; + /** @return Chain */ public static function nullOrPositive(): Chain; + /** @return Chain */ public static function nullOrPostalCode(string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public static function nullOrPrintable(string ...$additionalChars): Chain; + /** @return Chain */ public static function nullOrProperty(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function nullOrPropertyExists(string $propertyName): Chain; + /** @return Chain */ public static function nullOrPropertyOptional(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function nullOrPublicDomainSuffix(): Chain; + /** @return Chain */ public static function nullOrPunct(string ...$additionalChars): Chain; + /** @return Chain */ public static function nullOrReadable(): Chain; + /** @return Chain */ public static function nullOrRegex(string $regex): Chain; + /** @return Chain */ public static function nullOrResourceType(): Chain; + /** @return Chain */ public static function nullOrRoman(): Chain; + /** @return Chain */ public static function nullOrSatisfies(callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public static function nullOrScalarVal(): Chain; + /** @return Chain */ public static function nullOrShortCircuit(Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public static function nullOrSize(string $unit, Validator $validator): Chain; + /** @return Chain */ public static function nullOrSlug(): Chain; + /** @return Chain */ public static function nullOrSorted(string $direction): Chain; + /** @return Chain */ public static function nullOrSpace(string ...$additionalChars): Chain; + /** @return Chain */ public static function nullOrSpaced(): Chain; + /** @return Chain */ public static function nullOrStartsWith(mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public static function nullOrStringType(): Chain; + /** @return Chain */ public static function nullOrStringVal(): Chain; + /** @return Chain */ public static function nullOrSubdivisionCode(string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public static function nullOrSubset(array $superset): Chain; + /** @return Chain */ public static function nullOrSymbolicLink(): Chain; + /** @return Chain */ public static function nullOrTime(string $format = 'H:i:s'): Chain; + /** @return Chain */ public static function nullOrTld(): Chain; + /** @return Chain */ public static function nullOrTrimmed(string ...$trimValues): Chain; + /** @return Chain */ public static function nullOrTrueVal(): Chain; + /** @return Chain */ public static function nullOrUnique(): Chain; + /** @return Chain */ public static function nullOrUppercase(): Chain; + /** @return Chain */ public static function nullOrUrl(): Chain; + /** @return Chain */ public static function nullOrUuid(int|null $version = null): Chain; + /** @return Chain */ public static function nullOrVersion(): Chain; + /** @return Chain */ public static function nullOrVowel(string ...$additionalChars): Chain; + /** @return Chain */ public static function nullOrWhen(Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public static function nullOrWritable(): Chain; + /** @return Chain */ public static function nullOrXdigit(string ...$additionalChars): Chain; } diff --git a/src/Mixins/NullOrChain.php b/src/Mixins/NullOrChain.php index 31ea8fd53..d891c08fe 100644 --- a/src/Mixins/NullOrChain.php +++ b/src/Mixins/NullOrChain.php @@ -17,318 +17,489 @@ interface NullOrChain { + /** @return Chain */ public function nullOrAfter(callable $callable, Validator $validator): Chain; + /** @return Chain */ public function nullOrAll(Validator $validator): Chain; + /** @return Chain */ public function nullOrAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function nullOrAlnum(string ...$additionalChars): Chain; + /** @return Chain */ public function nullOrAlpha(string ...$additionalChars): Chain; + /** @return Chain */ public function nullOrAlwaysInvalid(): Chain; + /** @return Chain */ public function nullOrAlwaysValid(): Chain; + /** @return Chain */ public function nullOrAnyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function nullOrArrayType(): Chain; + /** @return Chain */ public function nullOrArrayVal(): Chain; + /** @return Chain */ public function nullOrAttributes(): Chain; + /** @return Chain */ public function nullOrBase(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public function nullOrBase64(): Chain; + /** @return Chain */ public function nullOrBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public function nullOrBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public function nullOrBoolType(): Chain; + /** @return Chain */ public function nullOrBoolVal(): Chain; + /** @return Chain */ public function nullOrBsn(): Chain; + /** @return Chain */ public function nullOrCallableType(): Chain; + /** @return Chain */ public function nullOrCharset(string $charset, string ...$charsets): Chain; + /** @return Chain */ public function nullOrCnh(): Chain; + /** @return Chain */ public function nullOrCnpj(): Chain; + /** @return Chain */ public function nullOrConsonant(string ...$additionalChars): Chain; + /** @return Chain */ public function nullOrContains(mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public function nullOrContainsAny(array $needles): Chain; + /** @return Chain */ public function nullOrContainsCount(mixed $containsValue, int $count): Chain; + /** @return Chain */ public function nullOrControl(string ...$additionalChars): Chain; + /** @return Chain */ public function nullOrCountable(): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public function nullOrCountryCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public function nullOrCpf(): Chain; + /** @return Chain */ public function nullOrCreditCard(string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public function nullOrCurrencyCode(string $set = 'alpha-3'): Chain; + /** @return Chain */ public function nullOrDate(string $format = 'Y-m-d'): Chain; + /** @return Chain */ public function nullOrDateTime(string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public function nullOrDateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public function nullOrDecimal(int $decimals): Chain; + /** @return Chain */ public function nullOrDigit(string ...$additionalChars): Chain; + /** @return Chain */ public function nullOrDirectory(): Chain; + /** @return Chain */ public function nullOrDomain(bool $tldCheck = true): Chain; + /** @return Chain */ public function nullOrEach(Validator $validator): Chain; + /** @return Chain */ public function nullOrEachKey(Validator $validator): Chain; + /** @return Chain */ public function nullOrEmail(): Chain; + /** @return Chain */ public function nullOrEmoji(): Chain; + /** @return Chain */ public function nullOrEndsWith(mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public function nullOrEquals(mixed $compareTo): Chain; + /** @return Chain */ public function nullOrEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public function nullOrEven(): Chain; + /** @return Chain */ public function nullOrExecutable(): Chain; + /** @return Chain */ public function nullOrExists(): Chain; + /** @return Chain */ public function nullOrExtension(string $extension): Chain; + /** @return Chain */ public function nullOrFactor(int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public function nullOrFactory(callable $factory): Chain; + /** @return Chain */ public function nullOrFalseVal(): Chain; + /** @return Chain */ public function nullOrFalsy(): Chain; + /** @return Chain */ public function nullOrFile(): Chain; + /** @return Chain */ public function nullOrFinite(): Chain; + /** @return Chain */ public function nullOrFloatType(): Chain; + /** @return Chain */ public function nullOrFloatVal(): Chain; + /** @return Chain */ public function nullOrFormat(Formatter $formatter): Chain; + /** @return Chain */ public function nullOrFormatted(Formatter $formatter, Validator $validator): Chain; + /** @return Chain */ public function nullOrGiven(Validator $when, Validator $then): Chain; + /** @return Chain */ public function nullOrGraph(string ...$additionalChars): Chain; + /** @return Chain */ public function nullOrGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public function nullOrGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function nullOrHetu(): Chain; + /** @return Chain */ public function nullOrHexRgbColor(): Chain; + /** @return Chain */ public function nullOrIban(): Chain; + /** @return Chain */ public function nullOrIdentical(mixed $compareTo): Chain; + /** @return Chain */ public function nullOrImage(): Chain; + /** @return Chain */ public function nullOrImei(): Chain; + /** @return Chain */ public function nullOrIn(mixed $haystack): Chain; + /** @return Chain */ public function nullOrInfinite(): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public function nullOrInstance(string $class): Chain; + /** @return Chain */ public function nullOrIntType(): Chain; + /** @return Chain */ public function nullOrIntVal(): Chain; + /** @return Chain */ public function nullOrIp(string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public function nullOrIsbn(): Chain; + /** @return Chain */ public function nullOrIterableType(): Chain; + /** @return Chain */ public function nullOrIterableVal(): Chain; + /** @return Chain */ public function nullOrJson(): Chain; + /** @return Chain */ public function nullOrKey(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function nullOrKeyExists(int|string $key): Chain; + /** @return Chain */ public function nullOrKeyOptional(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function nullOrKeySet(Validator $validator, Validator ...$validators): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public function nullOrLanguageCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public function nullOrLeapDate(string $format): Chain; + /** @return Chain */ public function nullOrLeapYear(): Chain; + /** @return Chain */ public function nullOrLength(Validator $validator): Chain; + /** @return Chain */ public function nullOrLessThan(mixed $compareTo): Chain; + /** @return Chain */ public function nullOrLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function nullOrLowercase(): Chain; + /** @return Chain */ public function nullOrLuhn(): Chain; + /** @return Chain */ public function nullOrMacAddress(): Chain; + /** @return Chain */ public function nullOrMax(Validator $validator): Chain; + /** @return Chain */ public function nullOrMimetype(string $mimetype): Chain; + /** @return Chain */ public function nullOrMin(Validator $validator): Chain; + /** @return Chain */ public function nullOrMultiple(int $multipleOf): Chain; + /** @return Chain */ public function nullOrNegative(): Chain; + /** @return Chain */ public function nullOrNfeAccessKey(): Chain; + /** @return Chain */ public function nullOrNif(): Chain; + /** @return Chain */ public function nullOrNip(): Chain; + /** @return Chain */ public function nullOrNoneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function nullOrNot(Validator $validator): Chain; + /** @return Chain */ public function nullOrNullType(): Chain; + /** @return Chain */ public function nullOrNumber(): Chain; + /** @return Chain */ public function nullOrNumericVal(): Chain; + /** @return Chain */ public function nullOrObjectType(): Chain; + /** @return Chain */ public function nullOrOdd(): Chain; + /** @return Chain */ public function nullOrOneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function nullOrPesel(): Chain; + /** @return Chain */ public function nullOrPhone(string|null $countryCode = null): Chain; + /** @return Chain */ public function nullOrPis(): Chain; + /** @return Chain */ public function nullOrPolishIdCard(): Chain; + /** @return Chain */ public function nullOrPortugueseNif(): Chain; + /** @return Chain */ public function nullOrPositive(): Chain; + /** @return Chain */ public function nullOrPostalCode(string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public function nullOrPrintable(string ...$additionalChars): Chain; + /** @return Chain */ public function nullOrProperty(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function nullOrPropertyExists(string $propertyName): Chain; + /** @return Chain */ public function nullOrPropertyOptional(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function nullOrPublicDomainSuffix(): Chain; + /** @return Chain */ public function nullOrPunct(string ...$additionalChars): Chain; + /** @return Chain */ public function nullOrReadable(): Chain; + /** @return Chain */ public function nullOrRegex(string $regex): Chain; + /** @return Chain */ public function nullOrResourceType(): Chain; + /** @return Chain */ public function nullOrRoman(): Chain; + /** @return Chain */ public function nullOrSatisfies(callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public function nullOrScalarVal(): Chain; + /** @return Chain */ public function nullOrShortCircuit(Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public function nullOrSize(string $unit, Validator $validator): Chain; + /** @return Chain */ public function nullOrSlug(): Chain; + /** @return Chain */ public function nullOrSorted(string $direction): Chain; + /** @return Chain */ public function nullOrSpace(string ...$additionalChars): Chain; + /** @return Chain */ public function nullOrSpaced(): Chain; + /** @return Chain */ public function nullOrStartsWith(mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public function nullOrStringType(): Chain; + /** @return Chain */ public function nullOrStringVal(): Chain; + /** @return Chain */ public function nullOrSubdivisionCode(string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public function nullOrSubset(array $superset): Chain; + /** @return Chain */ public function nullOrSymbolicLink(): Chain; + /** @return Chain */ public function nullOrTime(string $format = 'H:i:s'): Chain; + /** @return Chain */ public function nullOrTld(): Chain; + /** @return Chain */ public function nullOrTrimmed(string ...$trimValues): Chain; + /** @return Chain */ public function nullOrTrueVal(): Chain; + /** @return Chain */ public function nullOrUnique(): Chain; + /** @return Chain */ public function nullOrUppercase(): Chain; + /** @return Chain */ public function nullOrUrl(): Chain; + /** @return Chain */ public function nullOrUuid(int|null $version = null): Chain; + /** @return Chain */ public function nullOrVersion(): Chain; + /** @return Chain */ public function nullOrVowel(string ...$additionalChars): Chain; + /** @return Chain */ public function nullOrWhen(Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public function nullOrWritable(): Chain; + /** @return Chain */ public function nullOrXdigit(string ...$additionalChars): Chain; } diff --git a/src/Mixins/PropertyBuilder.php b/src/Mixins/PropertyBuilder.php index 8de4b7053..9b46cb83e 100644 --- a/src/Mixins/PropertyBuilder.php +++ b/src/Mixins/PropertyBuilder.php @@ -17,302 +17,465 @@ interface PropertyBuilder { + /** @return Chain */ public static function propertyAfter(string $propertyName, callable $callable, Validator $validator): Chain; + /** @return Chain */ public static function propertyAll(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function propertyAllOf(string $propertyName, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function propertyAlnum(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public static function propertyAlpha(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public static function propertyAlwaysInvalid(string $propertyName): Chain; + /** @return Chain */ public static function propertyAlwaysValid(string $propertyName): Chain; + /** @return Chain */ public static function propertyAnyOf(string $propertyName, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function propertyArrayType(string $propertyName): Chain; + /** @return Chain */ public static function propertyArrayVal(string $propertyName): Chain; + /** @return Chain */ public static function propertyBase(string $propertyName, int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public static function propertyBase64(string $propertyName): Chain; + /** @return Chain */ public static function propertyBetween(string $propertyName, mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public static function propertyBetweenExclusive(string $propertyName, mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public static function propertyBlank(string $propertyName): Chain; + /** @return Chain */ public static function propertyBoolType(string $propertyName): Chain; + /** @return Chain */ public static function propertyBoolVal(string $propertyName): Chain; + /** @return Chain */ public static function propertyBsn(string $propertyName): Chain; + /** @return Chain */ public static function propertyCallableType(string $propertyName): Chain; + /** @return Chain */ public static function propertyCharset(string $propertyName, string $charset, string ...$charsets): Chain; + /** @return Chain */ public static function propertyCnh(string $propertyName): Chain; + /** @return Chain */ public static function propertyCnpj(string $propertyName): Chain; + /** @return Chain */ public static function propertyConsonant(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public static function propertyContains(string $propertyName, mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public static function propertyContainsAny(string $propertyName, array $needles): Chain; + /** @return Chain */ public static function propertyContainsCount(string $propertyName, mixed $containsValue, int $count): Chain; + /** @return Chain */ public static function propertyControl(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public static function propertyCountable(string $propertyName): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public static function propertyCountryCode(string $propertyName, string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function propertyCpf(string $propertyName): Chain; + /** @return Chain */ public static function propertyCreditCard(string $propertyName, string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public static function propertyCurrencyCode(string $propertyName, string $set = 'alpha-3'): Chain; + /** @return Chain */ public static function propertyDate(string $propertyName, string $format = 'Y-m-d'): Chain; + /** @return Chain */ public static function propertyDateTime(string $propertyName, string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public static function propertyDateTimeDiff(string $propertyName, string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public static function propertyDecimal(string $propertyName, int $decimals): Chain; + /** @return Chain */ public static function propertyDigit(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public static function propertyDirectory(string $propertyName): Chain; + /** @return Chain */ public static function propertyDomain(string $propertyName, bool $tldCheck = true): Chain; + /** @return Chain */ public static function propertyEach(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function propertyEachKey(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function propertyEmail(string $propertyName): Chain; + /** @return Chain */ public static function propertyEmoji(string $propertyName): Chain; + /** @return Chain */ public static function propertyEndsWith(string $propertyName, mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public static function propertyEquals(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public static function propertyEquivalent(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public static function propertyEven(string $propertyName): Chain; + /** @return Chain */ public static function propertyExecutable(string $propertyName): Chain; + /** @return Chain */ public static function propertyExtension(string $propertyName, string $extension): Chain; + /** @return Chain */ public static function propertyFactor(string $propertyName, int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public static function propertyFactory(string $propertyName, callable $factory): Chain; + /** @return Chain */ public static function propertyFalseVal(string $propertyName): Chain; + /** @return Chain */ public static function propertyFalsy(string $propertyName): Chain; + /** @return Chain */ public static function propertyFile(string $propertyName): Chain; + /** @return Chain */ public static function propertyFinite(string $propertyName): Chain; + /** @return Chain */ public static function propertyFloatType(string $propertyName): Chain; + /** @return Chain */ public static function propertyFloatVal(string $propertyName): Chain; + /** @return Chain */ public static function propertyFormat(string $propertyName, Formatter $formatter): Chain; + /** @return Chain */ public static function propertyGiven(string $propertyName, Validator $when, Validator $then): Chain; + /** @return Chain */ public static function propertyGraph(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public static function propertyGreaterThan(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public static function propertyGreaterThanOrEqual(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public static function propertyHetu(string $propertyName): Chain; + /** @return Chain */ public static function propertyHexRgbColor(string $propertyName): Chain; + /** @return Chain */ public static function propertyIban(string $propertyName): Chain; + /** @return Chain */ public static function propertyIdentical(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public static function propertyImage(string $propertyName): Chain; + /** @return Chain */ public static function propertyImei(string $propertyName): Chain; + /** @return Chain */ public static function propertyIn(string $propertyName, mixed $haystack): Chain; + /** @return Chain */ public static function propertyInfinite(string $propertyName): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public static function propertyInstance(string $propertyName, string $class): Chain; + /** @return Chain */ public static function propertyIntType(string $propertyName): Chain; + /** @return Chain */ public static function propertyIntVal(string $propertyName): Chain; + /** @return Chain */ public static function propertyIp(string $propertyName, string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public static function propertyIsbn(string $propertyName): Chain; + /** @return Chain */ public static function propertyIterableType(string $propertyName): Chain; + /** @return Chain */ public static function propertyIterableVal(string $propertyName): Chain; + /** @return Chain */ public static function propertyJson(string $propertyName): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public static function propertyLanguageCode(string $propertyName, string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function propertyLeapDate(string $propertyName, string $format): Chain; + /** @return Chain */ public static function propertyLeapYear(string $propertyName): Chain; + /** @return Chain */ public static function propertyLength(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function propertyLessThan(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public static function propertyLessThanOrEqual(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public static function propertyLowercase(string $propertyName): Chain; + /** @return Chain */ public static function propertyLuhn(string $propertyName): Chain; + /** @return Chain */ public static function propertyMacAddress(string $propertyName): Chain; + /** @return Chain */ public static function propertyMax(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function propertyMimetype(string $propertyName, string $mimetype): Chain; + /** @return Chain */ public static function propertyMin(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function propertyMultiple(string $propertyName, int $multipleOf): Chain; + /** @return Chain */ public static function propertyNegative(string $propertyName): Chain; + /** @return Chain */ public static function propertyNfeAccessKey(string $propertyName): Chain; + /** @return Chain */ public static function propertyNif(string $propertyName): Chain; + /** @return Chain */ public static function propertyNip(string $propertyName): Chain; + /** @return Chain */ public static function propertyNoneOf(string $propertyName, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function propertyNot(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function propertyNullType(string $propertyName): Chain; + /** @return Chain */ public static function propertyNumber(string $propertyName): Chain; + /** @return Chain */ public static function propertyNumericVal(string $propertyName): Chain; + /** @return Chain */ public static function propertyObjectType(string $propertyName): Chain; + /** @return Chain */ public static function propertyOdd(string $propertyName): Chain; + /** @return Chain */ public static function propertyOneOf(string $propertyName, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function propertyPesel(string $propertyName): Chain; + /** @return Chain */ public static function propertyPhone(string $propertyName, string|null $countryCode = null): Chain; + /** @return Chain */ public static function propertyPis(string $propertyName): Chain; + /** @return Chain */ public static function propertyPolishIdCard(string $propertyName): Chain; + /** @return Chain */ public static function propertyPortugueseNif(string $propertyName): Chain; + /** @return Chain */ public static function propertyPositive(string $propertyName): Chain; + /** @return Chain */ public static function propertyPostalCode(string $propertyName, string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public static function propertyPrintable(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public static function propertyPublicDomainSuffix(string $propertyName): Chain; + /** @return Chain */ public static function propertyPunct(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public static function propertyReadable(string $propertyName): Chain; + /** @return Chain */ public static function propertyRegex(string $propertyName, string $regex): Chain; + /** @return Chain */ public static function propertyResourceType(string $propertyName): Chain; + /** @return Chain */ public static function propertyRoman(string $propertyName): Chain; + /** @return Chain */ public static function propertySatisfies(string $propertyName, callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public static function propertyScalarVal(string $propertyName): Chain; + /** @return Chain */ public static function propertyShortCircuit(string $propertyName, Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public static function propertySize(string $propertyName, string $unit, Validator $validator): Chain; + /** @return Chain */ public static function propertySlug(string $propertyName): Chain; + /** @return Chain */ public static function propertySorted(string $propertyName, string $direction): Chain; + /** @return Chain */ public static function propertySpace(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public static function propertySpaced(string $propertyName): Chain; + /** @return Chain */ public static function propertyStartsWith(string $propertyName, mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public static function propertyStringType(string $propertyName): Chain; + /** @return Chain */ public static function propertyStringVal(string $propertyName): Chain; + /** @return Chain */ public static function propertySubdivisionCode(string $propertyName, string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public static function propertySubset(string $propertyName, array $superset): Chain; + /** @return Chain */ public static function propertySymbolicLink(string $propertyName): Chain; + /** @return Chain */ public static function propertyTime(string $propertyName, string $format = 'H:i:s'): Chain; + /** @return Chain */ public static function propertyTld(string $propertyName): Chain; + /** @return Chain */ public static function propertyTrimmed(string $propertyName, string ...$trimValues): Chain; + /** @return Chain */ public static function propertyTrueVal(string $propertyName): Chain; + /** @return Chain */ public static function propertyUndef(string $propertyName): Chain; + /** @return Chain */ public static function propertyUnique(string $propertyName): Chain; + /** @return Chain */ public static function propertyUppercase(string $propertyName): Chain; + /** @return Chain */ public static function propertyUrl(string $propertyName): Chain; + /** @return Chain */ public static function propertyUuid(string $propertyName, int|null $version = null): Chain; + /** @return Chain */ public static function propertyVersion(string $propertyName): Chain; + /** @return Chain */ public static function propertyVowel(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public static function propertyWhen(string $propertyName, Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public static function propertyWritable(string $propertyName): Chain; + /** @return Chain */ public static function propertyXdigit(string $propertyName, string ...$additionalChars): Chain; } diff --git a/src/Mixins/PropertyChain.php b/src/Mixins/PropertyChain.php index 604017878..621d43caf 100644 --- a/src/Mixins/PropertyChain.php +++ b/src/Mixins/PropertyChain.php @@ -17,302 +17,465 @@ interface PropertyChain { + /** @return Chain */ public function propertyAfter(string $propertyName, callable $callable, Validator $validator): Chain; + /** @return Chain */ public function propertyAll(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function propertyAllOf(string $propertyName, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function propertyAlnum(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public function propertyAlpha(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public function propertyAlwaysInvalid(string $propertyName): Chain; + /** @return Chain */ public function propertyAlwaysValid(string $propertyName): Chain; + /** @return Chain */ public function propertyAnyOf(string $propertyName, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function propertyArrayType(string $propertyName): Chain; + /** @return Chain */ public function propertyArrayVal(string $propertyName): Chain; + /** @return Chain */ public function propertyBase(string $propertyName, int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public function propertyBase64(string $propertyName): Chain; + /** @return Chain */ public function propertyBetween(string $propertyName, mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public function propertyBetweenExclusive(string $propertyName, mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public function propertyBlank(string $propertyName): Chain; + /** @return Chain */ public function propertyBoolType(string $propertyName): Chain; + /** @return Chain */ public function propertyBoolVal(string $propertyName): Chain; + /** @return Chain */ public function propertyBsn(string $propertyName): Chain; + /** @return Chain */ public function propertyCallableType(string $propertyName): Chain; + /** @return Chain */ public function propertyCharset(string $propertyName, string $charset, string ...$charsets): Chain; + /** @return Chain */ public function propertyCnh(string $propertyName): Chain; + /** @return Chain */ public function propertyCnpj(string $propertyName): Chain; + /** @return Chain */ public function propertyConsonant(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public function propertyContains(string $propertyName, mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public function propertyContainsAny(string $propertyName, array $needles): Chain; + /** @return Chain */ public function propertyContainsCount(string $propertyName, mixed $containsValue, int $count): Chain; + /** @return Chain */ public function propertyControl(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public function propertyCountable(string $propertyName): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public function propertyCountryCode(string $propertyName, string $set = 'alpha-2'): Chain; + /** @return Chain */ public function propertyCpf(string $propertyName): Chain; + /** @return Chain */ public function propertyCreditCard(string $propertyName, string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public function propertyCurrencyCode(string $propertyName, string $set = 'alpha-3'): Chain; + /** @return Chain */ public function propertyDate(string $propertyName, string $format = 'Y-m-d'): Chain; + /** @return Chain */ public function propertyDateTime(string $propertyName, string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public function propertyDateTimeDiff(string $propertyName, string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public function propertyDecimal(string $propertyName, int $decimals): Chain; + /** @return Chain */ public function propertyDigit(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public function propertyDirectory(string $propertyName): Chain; + /** @return Chain */ public function propertyDomain(string $propertyName, bool $tldCheck = true): Chain; + /** @return Chain */ public function propertyEach(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function propertyEachKey(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function propertyEmail(string $propertyName): Chain; + /** @return Chain */ public function propertyEmoji(string $propertyName): Chain; + /** @return Chain */ public function propertyEndsWith(string $propertyName, mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public function propertyEquals(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public function propertyEquivalent(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public function propertyEven(string $propertyName): Chain; + /** @return Chain */ public function propertyExecutable(string $propertyName): Chain; + /** @return Chain */ public function propertyExtension(string $propertyName, string $extension): Chain; + /** @return Chain */ public function propertyFactor(string $propertyName, int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public function propertyFactory(string $propertyName, callable $factory): Chain; + /** @return Chain */ public function propertyFalseVal(string $propertyName): Chain; + /** @return Chain */ public function propertyFalsy(string $propertyName): Chain; + /** @return Chain */ public function propertyFile(string $propertyName): Chain; + /** @return Chain */ public function propertyFinite(string $propertyName): Chain; + /** @return Chain */ public function propertyFloatType(string $propertyName): Chain; + /** @return Chain */ public function propertyFloatVal(string $propertyName): Chain; + /** @return Chain */ public function propertyFormat(string $propertyName, Formatter $formatter): Chain; + /** @return Chain */ public function propertyGiven(string $propertyName, Validator $when, Validator $then): Chain; + /** @return Chain */ public function propertyGraph(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public function propertyGreaterThan(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public function propertyGreaterThanOrEqual(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public function propertyHetu(string $propertyName): Chain; + /** @return Chain */ public function propertyHexRgbColor(string $propertyName): Chain; + /** @return Chain */ public function propertyIban(string $propertyName): Chain; + /** @return Chain */ public function propertyIdentical(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public function propertyImage(string $propertyName): Chain; + /** @return Chain */ public function propertyImei(string $propertyName): Chain; + /** @return Chain */ public function propertyIn(string $propertyName, mixed $haystack): Chain; + /** @return Chain */ public function propertyInfinite(string $propertyName): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public function propertyInstance(string $propertyName, string $class): Chain; + /** @return Chain */ public function propertyIntType(string $propertyName): Chain; + /** @return Chain */ public function propertyIntVal(string $propertyName): Chain; + /** @return Chain */ public function propertyIp(string $propertyName, string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public function propertyIsbn(string $propertyName): Chain; + /** @return Chain */ public function propertyIterableType(string $propertyName): Chain; + /** @return Chain */ public function propertyIterableVal(string $propertyName): Chain; + /** @return Chain */ public function propertyJson(string $propertyName): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public function propertyLanguageCode(string $propertyName, string $set = 'alpha-2'): Chain; + /** @return Chain */ public function propertyLeapDate(string $propertyName, string $format): Chain; + /** @return Chain */ public function propertyLeapYear(string $propertyName): Chain; + /** @return Chain */ public function propertyLength(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function propertyLessThan(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public function propertyLessThanOrEqual(string $propertyName, mixed $compareTo): Chain; + /** @return Chain */ public function propertyLowercase(string $propertyName): Chain; + /** @return Chain */ public function propertyLuhn(string $propertyName): Chain; + /** @return Chain */ public function propertyMacAddress(string $propertyName): Chain; + /** @return Chain */ public function propertyMax(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function propertyMimetype(string $propertyName, string $mimetype): Chain; + /** @return Chain */ public function propertyMin(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function propertyMultiple(string $propertyName, int $multipleOf): Chain; + /** @return Chain */ public function propertyNegative(string $propertyName): Chain; + /** @return Chain */ public function propertyNfeAccessKey(string $propertyName): Chain; + /** @return Chain */ public function propertyNif(string $propertyName): Chain; + /** @return Chain */ public function propertyNip(string $propertyName): Chain; + /** @return Chain */ public function propertyNoneOf(string $propertyName, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function propertyNot(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function propertyNullType(string $propertyName): Chain; + /** @return Chain */ public function propertyNumber(string $propertyName): Chain; + /** @return Chain */ public function propertyNumericVal(string $propertyName): Chain; + /** @return Chain */ public function propertyObjectType(string $propertyName): Chain; + /** @return Chain */ public function propertyOdd(string $propertyName): Chain; + /** @return Chain */ public function propertyOneOf(string $propertyName, Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function propertyPesel(string $propertyName): Chain; + /** @return Chain */ public function propertyPhone(string $propertyName, string|null $countryCode = null): Chain; + /** @return Chain */ public function propertyPis(string $propertyName): Chain; + /** @return Chain */ public function propertyPolishIdCard(string $propertyName): Chain; + /** @return Chain */ public function propertyPortugueseNif(string $propertyName): Chain; + /** @return Chain */ public function propertyPositive(string $propertyName): Chain; + /** @return Chain */ public function propertyPostalCode(string $propertyName, string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public function propertyPrintable(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public function propertyPublicDomainSuffix(string $propertyName): Chain; + /** @return Chain */ public function propertyPunct(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public function propertyReadable(string $propertyName): Chain; + /** @return Chain */ public function propertyRegex(string $propertyName, string $regex): Chain; + /** @return Chain */ public function propertyResourceType(string $propertyName): Chain; + /** @return Chain */ public function propertyRoman(string $propertyName): Chain; + /** @return Chain */ public function propertySatisfies(string $propertyName, callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public function propertyScalarVal(string $propertyName): Chain; + /** @return Chain */ public function propertyShortCircuit(string $propertyName, Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public function propertySize(string $propertyName, string $unit, Validator $validator): Chain; + /** @return Chain */ public function propertySlug(string $propertyName): Chain; + /** @return Chain */ public function propertySorted(string $propertyName, string $direction): Chain; + /** @return Chain */ public function propertySpace(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public function propertySpaced(string $propertyName): Chain; + /** @return Chain */ public function propertyStartsWith(string $propertyName, mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public function propertyStringType(string $propertyName): Chain; + /** @return Chain */ public function propertyStringVal(string $propertyName): Chain; + /** @return Chain */ public function propertySubdivisionCode(string $propertyName, string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public function propertySubset(string $propertyName, array $superset): Chain; + /** @return Chain */ public function propertySymbolicLink(string $propertyName): Chain; + /** @return Chain */ public function propertyTime(string $propertyName, string $format = 'H:i:s'): Chain; + /** @return Chain */ public function propertyTld(string $propertyName): Chain; + /** @return Chain */ public function propertyTrimmed(string $propertyName, string ...$trimValues): Chain; + /** @return Chain */ public function propertyTrueVal(string $propertyName): Chain; + /** @return Chain */ public function propertyUndef(string $propertyName): Chain; + /** @return Chain */ public function propertyUnique(string $propertyName): Chain; + /** @return Chain */ public function propertyUppercase(string $propertyName): Chain; + /** @return Chain */ public function propertyUrl(string $propertyName): Chain; + /** @return Chain */ public function propertyUuid(string $propertyName, int|null $version = null): Chain; + /** @return Chain */ public function propertyVersion(string $propertyName): Chain; + /** @return Chain */ public function propertyVowel(string $propertyName, string ...$additionalChars): Chain; + /** @return Chain */ public function propertyWhen(string $propertyName, Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public function propertyWritable(string $propertyName): Chain; + /** @return Chain */ public function propertyXdigit(string $propertyName, string ...$additionalChars): Chain; } diff --git a/src/Mixins/UndefOrBuilder.php b/src/Mixins/UndefOrBuilder.php index 5b8a47378..66ef99082 100644 --- a/src/Mixins/UndefOrBuilder.php +++ b/src/Mixins/UndefOrBuilder.php @@ -17,316 +17,486 @@ interface UndefOrBuilder { + /** @return Chain */ public static function undefOrAfter(callable $callable, Validator $validator): Chain; + /** @return Chain */ public static function undefOrAll(Validator $validator): Chain; + /** @return Chain */ public static function undefOrAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function undefOrAlnum(string ...$additionalChars): Chain; + /** @return Chain */ public static function undefOrAlpha(string ...$additionalChars): Chain; + /** @return Chain */ public static function undefOrAlwaysInvalid(): Chain; + /** @return Chain */ public static function undefOrAlwaysValid(): Chain; + /** @return Chain */ public static function undefOrAnyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function undefOrArrayType(): Chain; + /** @return Chain */ public static function undefOrArrayVal(): Chain; + /** @return Chain */ public static function undefOrBase(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public static function undefOrBase64(): Chain; + /** @return Chain */ public static function undefOrBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public static function undefOrBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public static function undefOrBoolType(): Chain; + /** @return Chain */ public static function undefOrBoolVal(): Chain; + /** @return Chain */ public static function undefOrBsn(): Chain; + /** @return Chain */ public static function undefOrCallableType(): Chain; + /** @return Chain */ public static function undefOrCharset(string $charset, string ...$charsets): Chain; + /** @return Chain */ public static function undefOrCnh(): Chain; + /** @return Chain */ public static function undefOrCnpj(): Chain; + /** @return Chain */ public static function undefOrConsonant(string ...$additionalChars): Chain; + /** @return Chain */ public static function undefOrContains(mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public static function undefOrContainsAny(array $needles): Chain; + /** @return Chain */ public static function undefOrContainsCount(mixed $containsValue, int $count): Chain; + /** @return Chain */ public static function undefOrControl(string ...$additionalChars): Chain; + /** @return Chain */ public static function undefOrCountable(): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public static function undefOrCountryCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function undefOrCpf(): Chain; + /** @return Chain */ public static function undefOrCreditCard(string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public static function undefOrCurrencyCode(string $set = 'alpha-3'): Chain; + /** @return Chain */ public static function undefOrDate(string $format = 'Y-m-d'): Chain; + /** @return Chain */ public static function undefOrDateTime(string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public static function undefOrDateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public static function undefOrDecimal(int $decimals): Chain; + /** @return Chain */ public static function undefOrDigit(string ...$additionalChars): Chain; + /** @return Chain */ public static function undefOrDirectory(): Chain; + /** @return Chain */ public static function undefOrDomain(bool $tldCheck = true): Chain; + /** @return Chain */ public static function undefOrEach(Validator $validator): Chain; + /** @return Chain */ public static function undefOrEachKey(Validator $validator): Chain; + /** @return Chain */ public static function undefOrEmail(): Chain; + /** @return Chain */ public static function undefOrEmoji(): Chain; + /** @return Chain */ public static function undefOrEndsWith(mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public static function undefOrEquals(mixed $compareTo): Chain; + /** @return Chain */ public static function undefOrEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public static function undefOrEven(): Chain; + /** @return Chain */ public static function undefOrExecutable(): Chain; + /** @return Chain */ public static function undefOrExists(): Chain; + /** @return Chain */ public static function undefOrExtension(string $extension): Chain; + /** @return Chain */ public static function undefOrFactor(int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public static function undefOrFactory(callable $factory): Chain; + /** @return Chain */ public static function undefOrFalseVal(): Chain; + /** @return Chain */ public static function undefOrFalsy(): Chain; + /** @return Chain */ public static function undefOrFile(): Chain; + /** @return Chain */ public static function undefOrFinite(): Chain; + /** @return Chain */ public static function undefOrFloatType(): Chain; + /** @return Chain */ public static function undefOrFloatVal(): Chain; + /** @return Chain */ public static function undefOrFormat(Formatter $formatter): Chain; + /** @return Chain */ public static function undefOrFormatted(Formatter $formatter, Validator $validator): Chain; + /** @return Chain */ public static function undefOrGiven(Validator $when, Validator $then): Chain; + /** @return Chain */ public static function undefOrGraph(string ...$additionalChars): Chain; + /** @return Chain */ public static function undefOrGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public static function undefOrGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function undefOrHetu(): Chain; + /** @return Chain */ public static function undefOrHexRgbColor(): Chain; + /** @return Chain */ public static function undefOrIban(): Chain; + /** @return Chain */ public static function undefOrIdentical(mixed $compareTo): Chain; + /** @return Chain */ public static function undefOrImage(): Chain; + /** @return Chain */ public static function undefOrImei(): Chain; + /** @return Chain */ public static function undefOrIn(mixed $haystack): Chain; + /** @return Chain */ public static function undefOrInfinite(): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public static function undefOrInstance(string $class): Chain; + /** @return Chain */ public static function undefOrIntType(): Chain; + /** @return Chain */ public static function undefOrIntVal(): Chain; + /** @return Chain */ public static function undefOrIp(string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public static function undefOrIsbn(): Chain; + /** @return Chain */ public static function undefOrIterableType(): Chain; + /** @return Chain */ public static function undefOrIterableVal(): Chain; + /** @return Chain */ public static function undefOrJson(): Chain; + /** @return Chain */ public static function undefOrKey(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function undefOrKeyExists(int|string $key): Chain; + /** @return Chain */ public static function undefOrKeyOptional(int|string $key, Validator $validator): Chain; + /** @return Chain */ public static function undefOrKeySet(Validator $validator, Validator ...$validators): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public static function undefOrLanguageCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public static function undefOrLeapDate(string $format): Chain; + /** @return Chain */ public static function undefOrLeapYear(): Chain; + /** @return Chain */ public static function undefOrLength(Validator $validator): Chain; + /** @return Chain */ public static function undefOrLessThan(mixed $compareTo): Chain; + /** @return Chain */ public static function undefOrLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public static function undefOrLowercase(): Chain; + /** @return Chain */ public static function undefOrLuhn(): Chain; + /** @return Chain */ public static function undefOrMacAddress(): Chain; + /** @return Chain */ public static function undefOrMax(Validator $validator): Chain; + /** @return Chain */ public static function undefOrMimetype(string $mimetype): Chain; + /** @return Chain */ public static function undefOrMin(Validator $validator): Chain; + /** @return Chain */ public static function undefOrMultiple(int $multipleOf): Chain; + /** @return Chain */ public static function undefOrNegative(): Chain; + /** @return Chain */ public static function undefOrNfeAccessKey(): Chain; + /** @return Chain */ public static function undefOrNif(): Chain; + /** @return Chain */ public static function undefOrNip(): Chain; + /** @return Chain */ public static function undefOrNoneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function undefOrNot(Validator $validator): Chain; + /** @return Chain */ public static function undefOrNullType(): Chain; + /** @return Chain */ public static function undefOrNumber(): Chain; + /** @return Chain */ public static function undefOrNumericVal(): Chain; + /** @return Chain */ public static function undefOrObjectType(): Chain; + /** @return Chain */ public static function undefOrOdd(): Chain; + /** @return Chain */ public static function undefOrOneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public static function undefOrPesel(): Chain; + /** @return Chain */ public static function undefOrPhone(string|null $countryCode = null): Chain; + /** @return Chain */ public static function undefOrPis(): Chain; + /** @return Chain */ public static function undefOrPolishIdCard(): Chain; + /** @return Chain */ public static function undefOrPortugueseNif(): Chain; + /** @return Chain */ public static function undefOrPositive(): Chain; + /** @return Chain */ public static function undefOrPostalCode(string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public static function undefOrPrintable(string ...$additionalChars): Chain; + /** @return Chain */ public static function undefOrProperty(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function undefOrPropertyExists(string $propertyName): Chain; + /** @return Chain */ public static function undefOrPropertyOptional(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public static function undefOrPublicDomainSuffix(): Chain; + /** @return Chain */ public static function undefOrPunct(string ...$additionalChars): Chain; + /** @return Chain */ public static function undefOrReadable(): Chain; + /** @return Chain */ public static function undefOrRegex(string $regex): Chain; + /** @return Chain */ public static function undefOrResourceType(): Chain; + /** @return Chain */ public static function undefOrRoman(): Chain; + /** @return Chain */ public static function undefOrSatisfies(callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public static function undefOrScalarVal(): Chain; + /** @return Chain */ public static function undefOrShortCircuit(Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public static function undefOrSize(string $unit, Validator $validator): Chain; + /** @return Chain */ public static function undefOrSlug(): Chain; + /** @return Chain */ public static function undefOrSorted(string $direction): Chain; + /** @return Chain */ public static function undefOrSpace(string ...$additionalChars): Chain; + /** @return Chain */ public static function undefOrSpaced(): Chain; + /** @return Chain */ public static function undefOrStartsWith(mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public static function undefOrStringType(): Chain; + /** @return Chain */ public static function undefOrStringVal(): Chain; + /** @return Chain */ public static function undefOrSubdivisionCode(string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public static function undefOrSubset(array $superset): Chain; + /** @return Chain */ public static function undefOrSymbolicLink(): Chain; + /** @return Chain */ public static function undefOrTime(string $format = 'H:i:s'): Chain; + /** @return Chain */ public static function undefOrTld(): Chain; + /** @return Chain */ public static function undefOrTrimmed(string ...$trimValues): Chain; + /** @return Chain */ public static function undefOrTrueVal(): Chain; + /** @return Chain */ public static function undefOrUnique(): Chain; + /** @return Chain */ public static function undefOrUppercase(): Chain; + /** @return Chain */ public static function undefOrUrl(): Chain; + /** @return Chain */ public static function undefOrUuid(int|null $version = null): Chain; + /** @return Chain */ public static function undefOrVersion(): Chain; + /** @return Chain */ public static function undefOrVowel(string ...$additionalChars): Chain; + /** @return Chain */ public static function undefOrWhen(Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public static function undefOrWritable(): Chain; + /** @return Chain */ public static function undefOrXdigit(string ...$additionalChars): Chain; } diff --git a/src/Mixins/UndefOrChain.php b/src/Mixins/UndefOrChain.php index 248b573e5..1d2e597e8 100644 --- a/src/Mixins/UndefOrChain.php +++ b/src/Mixins/UndefOrChain.php @@ -17,316 +17,486 @@ interface UndefOrChain { + /** @return Chain */ public function undefOrAfter(callable $callable, Validator $validator): Chain; + /** @return Chain */ public function undefOrAll(Validator $validator): Chain; + /** @return Chain */ public function undefOrAllOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function undefOrAlnum(string ...$additionalChars): Chain; + /** @return Chain */ public function undefOrAlpha(string ...$additionalChars): Chain; + /** @return Chain */ public function undefOrAlwaysInvalid(): Chain; + /** @return Chain */ public function undefOrAlwaysValid(): Chain; + /** @return Chain */ public function undefOrAnyOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function undefOrArrayType(): Chain; + /** @return Chain */ public function undefOrArrayVal(): Chain; + /** @return Chain */ public function undefOrBase(int $base, string $chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): Chain; + /** @return Chain */ public function undefOrBase64(): Chain; + /** @return Chain */ public function undefOrBetween(mixed $minValue, mixed $maxValue): Chain; + /** @return Chain */ public function undefOrBetweenExclusive(mixed $minimum, mixed $maximum): Chain; + /** @return Chain */ public function undefOrBoolType(): Chain; + /** @return Chain */ public function undefOrBoolVal(): Chain; + /** @return Chain */ public function undefOrBsn(): Chain; + /** @return Chain */ public function undefOrCallableType(): Chain; + /** @return Chain */ public function undefOrCharset(string $charset, string ...$charsets): Chain; + /** @return Chain */ public function undefOrCnh(): Chain; + /** @return Chain */ public function undefOrCnpj(): Chain; + /** @return Chain */ public function undefOrConsonant(string ...$additionalChars): Chain; + /** @return Chain */ public function undefOrContains(mixed $containsValue): Chain; - /** @param non-empty-array $needles */ + /** + * @param non-empty-array $needles + * @return Chain + */ public function undefOrContainsAny(array $needles): Chain; + /** @return Chain */ public function undefOrContainsCount(mixed $containsValue, int $count): Chain; + /** @return Chain */ public function undefOrControl(string ...$additionalChars): Chain; + /** @return Chain */ public function undefOrCountable(): Chain; - /** @param "alpha-2"|"alpha-3"|"numeric" $set */ + /** + * @param "alpha-2"|"alpha-3"|"numeric" $set + * @return Chain + */ public function undefOrCountryCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public function undefOrCpf(): Chain; + /** @return Chain */ public function undefOrCreditCard(string $brand = 'Any'): Chain; - /** @param "alpha-3"|"numeric" $set */ + /** + * @param "alpha-3"|"numeric" $set + * @return Chain + */ public function undefOrCurrencyCode(string $set = 'alpha-3'): Chain; + /** @return Chain */ public function undefOrDate(string $format = 'Y-m-d'): Chain; + /** @return Chain */ public function undefOrDateTime(string|null $format = null): Chain; - /** @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type */ + /** + * @param "years"|"months"|"days"|"hours"|"minutes"|"seconds"|"microseconds" $type + * @return Chain + */ public function undefOrDateTimeDiff(string $type, Validator $validator, string|null $format = null, DateTimeImmutable|null $now = null): Chain; + /** @return Chain */ public function undefOrDecimal(int $decimals): Chain; + /** @return Chain */ public function undefOrDigit(string ...$additionalChars): Chain; + /** @return Chain */ public function undefOrDirectory(): Chain; + /** @return Chain */ public function undefOrDomain(bool $tldCheck = true): Chain; + /** @return Chain */ public function undefOrEach(Validator $validator): Chain; + /** @return Chain */ public function undefOrEachKey(Validator $validator): Chain; + /** @return Chain */ public function undefOrEmail(): Chain; + /** @return Chain */ public function undefOrEmoji(): Chain; + /** @return Chain */ public function undefOrEndsWith(mixed $endValue, mixed ...$endValues): Chain; + /** @return Chain */ public function undefOrEquals(mixed $compareTo): Chain; + /** @return Chain */ public function undefOrEquivalent(mixed $compareTo): Chain; + /** @return Chain */ public function undefOrEven(): Chain; + /** @return Chain */ public function undefOrExecutable(): Chain; + /** @return Chain */ public function undefOrExists(): Chain; + /** @return Chain */ public function undefOrExtension(string $extension): Chain; + /** @return Chain */ public function undefOrFactor(int $dividend): Chain; - /** @param callable(mixed): Validator $factory */ + /** + * @param callable(mixed): Validator $factory + * @return Chain + */ public function undefOrFactory(callable $factory): Chain; + /** @return Chain */ public function undefOrFalseVal(): Chain; + /** @return Chain */ public function undefOrFalsy(): Chain; + /** @return Chain */ public function undefOrFile(): Chain; + /** @return Chain */ public function undefOrFinite(): Chain; + /** @return Chain */ public function undefOrFloatType(): Chain; + /** @return Chain */ public function undefOrFloatVal(): Chain; + /** @return Chain */ public function undefOrFormat(Formatter $formatter): Chain; + /** @return Chain */ public function undefOrFormatted(Formatter $formatter, Validator $validator): Chain; + /** @return Chain */ public function undefOrGiven(Validator $when, Validator $then): Chain; + /** @return Chain */ public function undefOrGraph(string ...$additionalChars): Chain; + /** @return Chain */ public function undefOrGreaterThan(mixed $compareTo): Chain; + /** @return Chain */ public function undefOrGreaterThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function undefOrHetu(): Chain; + /** @return Chain */ public function undefOrHexRgbColor(): Chain; + /** @return Chain */ public function undefOrIban(): Chain; + /** @return Chain */ public function undefOrIdentical(mixed $compareTo): Chain; + /** @return Chain */ public function undefOrImage(): Chain; + /** @return Chain */ public function undefOrImei(): Chain; + /** @return Chain */ public function undefOrIn(mixed $haystack): Chain; + /** @return Chain */ public function undefOrInfinite(): Chain; - /** @param class-string $class */ + /** + * @param class-string $class + * @return Chain + */ public function undefOrInstance(string $class): Chain; + /** @return Chain */ public function undefOrIntType(): Chain; + /** @return Chain */ public function undefOrIntVal(): Chain; + /** @return Chain */ public function undefOrIp(string $range = '*', int|null $options = null): Chain; + /** @return Chain */ public function undefOrIsbn(): Chain; + /** @return Chain */ public function undefOrIterableType(): Chain; + /** @return Chain */ public function undefOrIterableVal(): Chain; + /** @return Chain */ public function undefOrJson(): Chain; + /** @return Chain */ public function undefOrKey(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function undefOrKeyExists(int|string $key): Chain; + /** @return Chain */ public function undefOrKeyOptional(int|string $key, Validator $validator): Chain; + /** @return Chain */ public function undefOrKeySet(Validator $validator, Validator ...$validators): Chain; - /** @param "alpha-2"|"alpha-3" $set */ + /** + * @param "alpha-2"|"alpha-3" $set + * @return Chain + */ public function undefOrLanguageCode(string $set = 'alpha-2'): Chain; + /** @return Chain */ public function undefOrLeapDate(string $format): Chain; + /** @return Chain */ public function undefOrLeapYear(): Chain; + /** @return Chain */ public function undefOrLength(Validator $validator): Chain; + /** @return Chain */ public function undefOrLessThan(mixed $compareTo): Chain; + /** @return Chain */ public function undefOrLessThanOrEqual(mixed $compareTo): Chain; + /** @return Chain */ public function undefOrLowercase(): Chain; + /** @return Chain */ public function undefOrLuhn(): Chain; + /** @return Chain */ public function undefOrMacAddress(): Chain; + /** @return Chain */ public function undefOrMax(Validator $validator): Chain; + /** @return Chain */ public function undefOrMimetype(string $mimetype): Chain; + /** @return Chain */ public function undefOrMin(Validator $validator): Chain; + /** @return Chain */ public function undefOrMultiple(int $multipleOf): Chain; + /** @return Chain */ public function undefOrNegative(): Chain; + /** @return Chain */ public function undefOrNfeAccessKey(): Chain; + /** @return Chain */ public function undefOrNif(): Chain; + /** @return Chain */ public function undefOrNip(): Chain; + /** @return Chain */ public function undefOrNoneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function undefOrNot(Validator $validator): Chain; + /** @return Chain */ public function undefOrNullType(): Chain; + /** @return Chain */ public function undefOrNumber(): Chain; + /** @return Chain */ public function undefOrNumericVal(): Chain; + /** @return Chain */ public function undefOrObjectType(): Chain; + /** @return Chain */ public function undefOrOdd(): Chain; + /** @return Chain */ public function undefOrOneOf(Validator $validator1, Validator $validator2, Validator ...$validators): Chain; + /** @return Chain */ public function undefOrPesel(): Chain; + /** @return Chain */ public function undefOrPhone(string|null $countryCode = null): Chain; + /** @return Chain */ public function undefOrPis(): Chain; + /** @return Chain */ public function undefOrPolishIdCard(): Chain; + /** @return Chain */ public function undefOrPortugueseNif(): Chain; + /** @return Chain */ public function undefOrPositive(): Chain; + /** @return Chain */ public function undefOrPostalCode(string $countryCode, bool $formatted = false): Chain; + /** @return Chain */ public function undefOrPrintable(string ...$additionalChars): Chain; + /** @return Chain */ public function undefOrProperty(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function undefOrPropertyExists(string $propertyName): Chain; + /** @return Chain */ public function undefOrPropertyOptional(string $propertyName, Validator $validator): Chain; + /** @return Chain */ public function undefOrPublicDomainSuffix(): Chain; + /** @return Chain */ public function undefOrPunct(string ...$additionalChars): Chain; + /** @return Chain */ public function undefOrReadable(): Chain; + /** @return Chain */ public function undefOrRegex(string $regex): Chain; + /** @return Chain */ public function undefOrResourceType(): Chain; + /** @return Chain */ public function undefOrRoman(): Chain; + /** @return Chain */ public function undefOrSatisfies(callable $callback, mixed ...$arguments): Chain; + /** @return Chain */ public function undefOrScalarVal(): Chain; + /** @return Chain */ public function undefOrShortCircuit(Validator ...$validators): Chain; - /** @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit */ + /** + * @param "B"|"KB"|"MB"|"GB"|"TB"|"PB"|"EB"|"ZB"|"YB" $unit + * @return Chain + */ public function undefOrSize(string $unit, Validator $validator): Chain; + /** @return Chain */ public function undefOrSlug(): Chain; + /** @return Chain */ public function undefOrSorted(string $direction): Chain; + /** @return Chain */ public function undefOrSpace(string ...$additionalChars): Chain; + /** @return Chain */ public function undefOrSpaced(): Chain; + /** @return Chain */ public function undefOrStartsWith(mixed $startValue, mixed ...$startValues): Chain; + /** @return Chain */ public function undefOrStringType(): Chain; + /** @return Chain */ public function undefOrStringVal(): Chain; + /** @return Chain */ public function undefOrSubdivisionCode(string $countryCode): Chain; - /** @param mixed[] $superset */ + /** + * @param mixed[] $superset + * @return Chain + */ public function undefOrSubset(array $superset): Chain; + /** @return Chain */ public function undefOrSymbolicLink(): Chain; + /** @return Chain */ public function undefOrTime(string $format = 'H:i:s'): Chain; + /** @return Chain */ public function undefOrTld(): Chain; + /** @return Chain */ public function undefOrTrimmed(string ...$trimValues): Chain; + /** @return Chain */ public function undefOrTrueVal(): Chain; + /** @return Chain */ public function undefOrUnique(): Chain; + /** @return Chain */ public function undefOrUppercase(): Chain; + /** @return Chain */ public function undefOrUrl(): Chain; + /** @return Chain */ public function undefOrUuid(int|null $version = null): Chain; + /** @return Chain */ public function undefOrVersion(): Chain; + /** @return Chain */ public function undefOrVowel(string ...$additionalChars): Chain; + /** @return Chain */ public function undefOrWhen(Validator $when, Validator $then, Validator|null $else = null): Chain; + /** @return Chain */ public function undefOrWritable(): Chain; + /** @return Chain */ public function undefOrXdigit(string ...$additionalChars): Chain; } diff --git a/src/Validators/All.php b/src/Validators/All.php index 4080e74cb..da6077e90 100644 --- a/src/Validators/All.php +++ b/src/Validators/All.php @@ -15,6 +15,10 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; +use Respect\Fluent\Attributes\AssuranceFrom; +use Respect\Fluent\Attributes\AssuranceSubject; +use Respect\Fluent\Attributes\AssuranceSubjectMode; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Helpers\CanEvaluateShortCircuit; use Respect\Validation\Message\Template; @@ -26,6 +30,8 @@ #[Composable(prefix: self::class, without: [self::class])] #[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] #[Template('Every item in', 'Every item in')] +#[Assurance(from: AssuranceFrom::Elements)] +#[AssuranceSubject(AssuranceSubjectMode::Elements)] final class All extends FilteredArray implements ShortCircuitable { use CanEvaluateShortCircuit; diff --git a/src/Validators/Alnum.php b/src/Validators/Alnum.php index d734082b1..755c2fe49 100644 --- a/src/Validators/Alnum.php +++ b/src/Validators/Alnum.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\FilteredString; @@ -31,6 +32,7 @@ '{{subject}} must not consist only of letters (a-z), digits (0-9), or {{additionalChars}}', self::TEMPLATE_EXTRA, )] +#[Assurance(type: 'scalar')] final class Alnum extends FilteredString { protected function isValid(string $input): bool diff --git a/src/Validators/Alpha.php b/src/Validators/Alpha.php index 986554c6a..5b62c5ce7 100644 --- a/src/Validators/Alpha.php +++ b/src/Validators/Alpha.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\FilteredString; @@ -31,6 +32,7 @@ '{{subject}} must not consist only of letters (a-z) or {{additionalChars}}', self::TEMPLATE_EXTRA, )] +#[Assurance(type: 'scalar')] final class Alpha extends FilteredString { protected function isValid(string $input): bool diff --git a/src/Validators/ArrayType.php b/src/Validators/ArrayType.php index 9ada2804e..a4a9a1df0 100644 --- a/src/Validators/ArrayType.php +++ b/src/Validators/ArrayType.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -27,6 +28,7 @@ '{{subject}} must be an array', '{{subject}} must not be an array', )] +#[Assurance(type: 'array')] final class ArrayType extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/ArrayVal.php b/src/Validators/ArrayVal.php index cede9834c..f12267328 100644 --- a/src/Validators/ArrayVal.php +++ b/src/Validators/ArrayVal.php @@ -18,6 +18,7 @@ use ArrayAccess; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; use SimpleXMLElement; @@ -29,6 +30,7 @@ '{{subject}} must be an array', '{{subject}} must not be an array', )] +#[Assurance(type: ['array', ArrayAccess::class, SimpleXMLElement::class])] final class ArrayVal extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Attributes.php b/src/Validators/Attributes.php index 9e277772f..ed9b5f0bd 100644 --- a/src/Validators/Attributes.php +++ b/src/Validators/Attributes.php @@ -20,6 +20,7 @@ use ReflectionObject; use ReflectionProperty; use ReflectionUnionType; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\Parameter\Resolver; use Respect\Validation\Id; @@ -37,6 +38,7 @@ '{{subject}} must contain a circular reference', Attributes::TEMPLATE_CIRCULAR_REFERENCE, )] +#[Assurance(type: 'object')] final class Attributes implements Validator { public const string TEMPLATE_CIRCULAR_REFERENCE = '__circular_reference__'; diff --git a/src/Validators/Base64.php b/src/Validators/Base64.php index 560857a02..21cf3543e 100644 --- a/src/Validators/Base64.php +++ b/src/Validators/Base64.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -29,6 +30,7 @@ '{{subject}} must be a base64-encoded string', '{{subject}} must not be a base64-encoded string', )] +#[Assurance(type: 'string')] final class Base64 extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/BoolType.php b/src/Validators/BoolType.php index 49626f90b..4e7c1e1af 100644 --- a/src/Validators/BoolType.php +++ b/src/Validators/BoolType.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -25,6 +26,7 @@ '{{subject}} must be a boolean', '{{subject}} must not be a boolean', )] +#[Assurance(type: 'bool')] final class BoolType extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/BoolVal.php b/src/Validators/BoolVal.php index 277ca2409..cbeb50820 100644 --- a/src/Validators/BoolVal.php +++ b/src/Validators/BoolVal.php @@ -18,6 +18,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -32,6 +33,7 @@ '{{subject}} must be a boolean', '{{subject}} must not be a boolean', )] +#[Assurance(type: 'scalar|null')] final class BoolVal extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Bsn.php b/src/Validators/Bsn.php index 7d4ac1838..5462e73cf 100644 --- a/src/Validators/Bsn.php +++ b/src/Validators/Bsn.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -29,6 +30,7 @@ '{{subject}} must be a BSN', '{{subject}} must not be a BSN', )] +#[Assurance(type: 'scalar')] final class Bsn extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/CallableType.php b/src/Validators/CallableType.php index 04dc72cb0..3a543eaf7 100644 --- a/src/Validators/CallableType.php +++ b/src/Validators/CallableType.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -24,6 +25,7 @@ '{{subject}} must be a callable function', '{{subject}} must not be a callable function', )] +#[Assurance(type: 'callable')] final class CallableType extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Charset.php b/src/Validators/Charset.php index 7ac4c01d3..a4cbb77b4 100644 --- a/src/Validators/Charset.php +++ b/src/Validators/Charset.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Message\Template; use Respect\Validation\Result; @@ -33,6 +34,7 @@ '{{subject}} must consist only of characters from the {{charset|list:or}} character-set', '{{subject}} must not consist only of characters from the {{charset|list:or}} character-set', )] +#[Assurance(type: 'string')] final readonly class Charset implements Validator { /** @var non-empty-array */ diff --git a/src/Validators/Cnh.php b/src/Validators/Cnh.php index 50b9a5664..c2adb7b6e 100644 --- a/src/Validators/Cnh.php +++ b/src/Validators/Cnh.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -30,6 +31,7 @@ '{{subject}} must be a CNH', '{{subject}} must not be a CNH', )] +#[Assurance(type: 'scalar')] final class Cnh extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Cnpj.php b/src/Validators/Cnpj.php index 3cfc56918..4fd72e410 100644 --- a/src/Validators/Cnpj.php +++ b/src/Validators/Cnpj.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -34,6 +35,7 @@ '{{subject}} must be a CNPJ', '{{subject}} must not be a CNPJ', )] +#[Assurance(type: 'scalar')] final class Cnpj extends Simple { private const int BASE_ASCII = 48; diff --git a/src/Validators/Consonant.php b/src/Validators/Consonant.php index da517afb5..117895b7c 100644 --- a/src/Validators/Consonant.php +++ b/src/Validators/Consonant.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\FilteredString; @@ -33,6 +34,7 @@ '{{subject}} must not consist only of consonants or {{additionalChars}}', self::TEMPLATE_EXTRA, )] +#[Assurance(type: 'scalar')] final class Consonant extends FilteredString { protected function isValid(string $input): bool diff --git a/src/Validators/Contains.php b/src/Validators/Contains.php index 893be994f..0a83c22d1 100644 --- a/src/Validators/Contains.php +++ b/src/Validators/Contains.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -30,6 +31,7 @@ '{{subject}} must contain {{containsValue}}', '{{subject}} must not contain {{containsValue}}', )] +#[Assurance(type: 'scalar|array')] final readonly class Contains implements Validator { public function __construct(private mixed $containsValue) diff --git a/src/Validators/ContainsAny.php b/src/Validators/ContainsAny.php index df18e511e..3aeb0c219 100644 --- a/src/Validators/ContainsAny.php +++ b/src/Validators/ContainsAny.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Envelope; @@ -25,6 +26,7 @@ '{{subject}} must contain at least one value from {{needles}}', '{{subject}} must not contain any value from {{needles}}', )] +#[Assurance(type: 'scalar|array')] final class ContainsAny extends Envelope { /** @param non-empty-array $needles */ diff --git a/src/Validators/ContainsCount.php b/src/Validators/ContainsCount.php index 413c019b6..cd96d8da2 100644 --- a/src/Validators/ContainsCount.php +++ b/src/Validators/ContainsCount.php @@ -12,6 +12,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -32,6 +33,7 @@ '{{subject}} must not contain {{containsValue}} only once', self::TEMPLATE_ONCE, )] +#[Assurance(type: 'scalar|array')] final readonly class ContainsCount implements Validator { public const string TEMPLATE_TIMES = '__times__'; diff --git a/src/Validators/Control.php b/src/Validators/Control.php index dc6dea0db..6ed6e4b21 100644 --- a/src/Validators/Control.php +++ b/src/Validators/Control.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\FilteredString; @@ -32,6 +33,7 @@ '{{subject}} must not consist only of control characters or {{additionalChars}}', self::TEMPLATE_EXTRA, )] +#[Assurance(type: 'scalar')] final class Control extends FilteredString { protected function isValid(string $input): bool diff --git a/src/Validators/Countable.php b/src/Validators/Countable.php index 7b75be4f0..e61d0cf28 100644 --- a/src/Validators/Countable.php +++ b/src/Validators/Countable.php @@ -20,6 +20,7 @@ use Attribute; use Countable as CountableInterface; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -30,6 +31,7 @@ '{{subject}} must be countable', '{{subject}} must not be countable', )] +#[Assurance(type: ['array', CountableInterface::class])] final class Countable extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/CountryCode.php b/src/Validators/CountryCode.php index 4e8b042f3..4517a4703 100644 --- a/src/Validators/CountryCode.php +++ b/src/Validators/CountryCode.php @@ -18,6 +18,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Exceptions\MissingComposerDependencyException; use Respect\Validation\Message\Template; @@ -34,6 +35,7 @@ '{{subject}} must be a country code', '{{subject}} must not be a country code', )] +#[Assurance(type: 'string')] final readonly class CountryCode implements Validator { private Countries $countries; diff --git a/src/Validators/Cpf.php b/src/Validators/Cpf.php index 1e2f69f81..2fd72c869 100644 --- a/src/Validators/Cpf.php +++ b/src/Validators/Cpf.php @@ -20,6 +20,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -33,6 +34,7 @@ '{{subject}} must be a CPF', '{{subject}} must not be a CPF', )] +#[Assurance(type: 'string')] final class Cpf extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/CreditCard.php b/src/Validators/CreditCard.php index 9fc2a6eb3..7dbeb75b8 100644 --- a/src/Validators/CreditCard.php +++ b/src/Validators/CreditCard.php @@ -20,6 +20,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Message\Template; use Respect\Validation\Result; @@ -41,6 +42,7 @@ '{{subject}} must not be a {{brand|raw}} credit card number', self::TEMPLATE_BRANDED, )] +#[Assurance(type: 'scalar')] final readonly class CreditCard implements Validator { public const string TEMPLATE_BRANDED = '__branded__'; diff --git a/src/Validators/CurrencyCode.php b/src/Validators/CurrencyCode.php index 99381462b..88ce198b5 100644 --- a/src/Validators/CurrencyCode.php +++ b/src/Validators/CurrencyCode.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Exceptions\MissingComposerDependencyException; use Respect\Validation\Message\Template; @@ -30,6 +31,7 @@ '{{subject}} must be a currency code', '{{subject}} must not be a currency code', )] +#[Assurance(type: 'string')] final readonly class CurrencyCode implements Validator { private Currencies $currencies; diff --git a/src/Validators/Date.php b/src/Validators/Date.php index 151ee9b0a..44745f0bb 100644 --- a/src/Validators/Date.php +++ b/src/Validators/Date.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Helpers\CanValidateDateTime; use Respect\Validation\Message\Template; @@ -33,6 +34,7 @@ '{{subject}} must be a date in the {{sample}} format', '{{subject}} must not be a date in the {{sample}} format', )] +#[Assurance(type: 'scalar')] final readonly class Date implements Validator { use CanValidateDateTime; diff --git a/src/Validators/DateTime.php b/src/Validators/DateTime.php index 8cef8308e..744c2421c 100644 --- a/src/Validators/DateTime.php +++ b/src/Validators/DateTime.php @@ -18,6 +18,7 @@ use Attribute; use DateTimeInterface; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Helpers\CanValidateDateTime; use Respect\Validation\Message\Template; use Respect\Validation\Result; @@ -38,6 +39,7 @@ '{{subject}} must not be a date/time in the {{sample}} format', self::TEMPLATE_FORMAT, )] +#[Assurance(type: ['scalar', DateTimeInterface::class])] final class DateTime implements Validator { use CanValidateDateTime; diff --git a/src/Validators/DateTimeDiff.php b/src/Validators/DateTimeDiff.php index 194a117d1..96373a362 100644 --- a/src/Validators/DateTimeDiff.php +++ b/src/Validators/DateTimeDiff.php @@ -14,6 +14,7 @@ use Attribute; use DateTimeImmutable; use DateTimeInterface; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Helpers\CanValidateDateTime; use Respect\Validation\Message\Template; @@ -44,6 +45,7 @@ 'For comparison with {{now|raw}}, {{subject}} must not be a datetime in the format {{sample|raw}}', self::TEMPLATE_WRONG_FORMAT, )] +#[Assurance(type: ['string', DateTimeInterface::class])] final readonly class DateTimeDiff implements Validator { use CanValidateDateTime; diff --git a/src/Validators/Decimal.php b/src/Validators/Decimal.php index 424109587..82856a3dd 100644 --- a/src/Validators/Decimal.php +++ b/src/Validators/Decimal.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -28,6 +29,7 @@ '{{subject}} must have {{decimals}} decimal places', '{{subject}} must not have {{decimals}} decimal places', )] +#[Assurance(type: 'int|float|numeric-string')] final readonly class Decimal implements Validator { public function __construct( diff --git a/src/Validators/Digit.php b/src/Validators/Digit.php index 5d432749b..b8e32aba8 100644 --- a/src/Validators/Digit.php +++ b/src/Validators/Digit.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\FilteredString; @@ -31,6 +32,7 @@ '{{subject}} must not consist only of digits (0-9) or {{additionalChars}}', self::TEMPLATE_EXTRA, )] +#[Assurance(type: 'scalar')] final class Digit extends FilteredString { protected function isValid(string $input): bool diff --git a/src/Validators/Directory.php b/src/Validators/Directory.php index 4437ac4f0..f3987dca3 100644 --- a/src/Validators/Directory.php +++ b/src/Validators/Directory.php @@ -16,6 +16,7 @@ use Attribute; use Directory as NativeDirectory; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; use SplFileInfo; @@ -28,6 +29,7 @@ '{{subject}} must be an accessible existing directory', '{{subject}} must not be an accessible existing directory', )] +#[Assurance(type: ['string', SplFileInfo::class])] final class Directory extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Domain.php b/src/Validators/Domain.php index e4ec03bc0..5053fe80a 100644 --- a/src/Validators/Domain.php +++ b/src/Validators/Domain.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -30,6 +31,7 @@ '{{subject}} must be an internet domain', '{{subject}} must not be an internet domain', )] +#[Assurance(type: 'string')] final class Domain implements Validator { private readonly Validator $genericRule; diff --git a/src/Validators/Each.php b/src/Validators/Each.php index 43d24f04f..c3aa48ebd 100644 --- a/src/Validators/Each.php +++ b/src/Validators/Each.php @@ -18,6 +18,8 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; +use Respect\Fluent\Attributes\AssuranceFrom; use Respect\Validation\Helpers\CanEvaluateShortCircuit; use Respect\Validation\Message\Template; use Respect\Validation\Path; @@ -32,6 +34,7 @@ 'Each item in {{subject}} must be valid', 'Each item in {{subject}} must be invalid', )] +#[Assurance(from: AssuranceFrom::Elements)] final class Each extends FilteredArray implements ShortCircuitable { use CanEvaluateShortCircuit; diff --git a/src/Validators/Email.php b/src/Validators/Email.php index 86f52296e..f1f2a55a7 100644 --- a/src/Validators/Email.php +++ b/src/Validators/Email.php @@ -21,6 +21,7 @@ use Attribute; use Egulias\EmailValidator\EmailValidator; use Egulias\EmailValidator\Validation\RFCValidation; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -35,6 +36,7 @@ '{{subject}} must be an email address', '{{subject}} must not be an email address', )] +#[Assurance(type: 'string')] final class Email extends Simple { private readonly EmailValidator|null $validator; diff --git a/src/Validators/Emoji.php b/src/Validators/Emoji.php index fa258c4c1..141d084bb 100644 --- a/src/Validators/Emoji.php +++ b/src/Validators/Emoji.php @@ -12,6 +12,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -23,6 +24,7 @@ '{{subject}} must be an emoji', '{{subject}} must not be an emoji', )] +#[Assurance(type: 'string')] final class Emoji extends Simple { private const string REGEX = <<<'REGEX' diff --git a/src/Validators/EndsWith.php b/src/Validators/EndsWith.php index 5056a446a..ee379d3ac 100644 --- a/src/Validators/EndsWith.php +++ b/src/Validators/EndsWith.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -37,6 +38,7 @@ '{{subject}} must not end with {{endValues|list:or}}', self::TEMPLATE_MULTIPLE_VALUES, )] +#[Assurance(type: 'array|string')] final readonly class EndsWith implements Validator { public const string TEMPLATE_MULTIPLE_VALUES = '__multiple_values__'; diff --git a/src/Validators/Even.php b/src/Validators/Even.php index 9ed4c8c4f..8641a9855 100644 --- a/src/Validators/Even.php +++ b/src/Validators/Even.php @@ -18,6 +18,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -32,6 +33,7 @@ '{{subject}} must be an even number', '{{subject}} must be an odd number', )] +#[Assurance(type: 'int|float|numeric-string')] final class Even extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Executable.php b/src/Validators/Executable.php index 6e056f740..b1e4b965b 100644 --- a/src/Validators/Executable.php +++ b/src/Validators/Executable.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; use SplFileInfo; @@ -27,6 +28,7 @@ '{{subject}} must be an accessible existing executable file', '{{subject}} must not be an accessible existing executable file', )] +#[Assurance(type: ['string', SplFileInfo::class])] final class Executable extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Exists.php b/src/Validators/Exists.php index c9b005ef4..08409db15 100644 --- a/src/Validators/Exists.php +++ b/src/Validators/Exists.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -29,6 +30,7 @@ '{{subject}} must be an existing file', '{{subject}} must not be an existing file', )] +#[Assurance(type: ['string', SplFileInfo::class])] final class Exists extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Extension.php b/src/Validators/Extension.php index 317fef0c6..7d4e7b742 100644 --- a/src/Validators/Extension.php +++ b/src/Validators/Extension.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -28,6 +29,7 @@ '{{subject}} must have the {{extension}} extension', '{{subject}} must not have the {{extension}} extension', )] +#[Assurance(type: ['string', SplFileInfo::class])] final readonly class Extension implements Validator { public function __construct( diff --git a/src/Validators/FalseVal.php b/src/Validators/FalseVal.php index e5f1fc76a..1086dd9ce 100644 --- a/src/Validators/FalseVal.php +++ b/src/Validators/FalseVal.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -26,6 +27,7 @@ '{{subject}} must evaluate to `false`', '{{subject}} must not evaluate to `false`', )] +#[Assurance(type: 'scalar|null')] final class FalseVal extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/File.php b/src/Validators/File.php index 2d48d3d55..e0625d7d7 100644 --- a/src/Validators/File.php +++ b/src/Validators/File.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; use SplFileInfo; @@ -27,6 +28,7 @@ '{{subject}} must be an accessible existing file', '{{subject}} must not be an accessible existing file', )] +#[Assurance(type: ['string', SplFileInfo::class])] final class File extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Finite.php b/src/Validators/Finite.php index 1b79d3944..dcd835a9e 100644 --- a/src/Validators/Finite.php +++ b/src/Validators/Finite.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -28,6 +29,7 @@ '{{subject}} must be a finite number', '{{subject}} must not be a finite number', )] +#[Assurance(type: 'int|float|numeric-string')] final class Finite extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/FloatType.php b/src/Validators/FloatType.php index a94de207c..f87feb076 100644 --- a/src/Validators/FloatType.php +++ b/src/Validators/FloatType.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -25,6 +26,7 @@ '{{subject}} must be a float', '{{subject}} must not be a float', )] +#[Assurance(type: 'float')] final class FloatType extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/FloatVal.php b/src/Validators/FloatVal.php index 515327314..13578c400 100644 --- a/src/Validators/FloatVal.php +++ b/src/Validators/FloatVal.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -29,6 +30,7 @@ '{{subject}} must be a floating-point number', '{{subject}} must not be a floating-point number', )] +#[Assurance(type: 'int|float|numeric-string|true')] final class FloatVal extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Format.php b/src/Validators/Format.php index 99a35a975..c56e19332 100644 --- a/src/Validators/Format.php +++ b/src/Validators/Format.php @@ -12,16 +12,19 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\StringFormatter\Formatter; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; +use Stringable; #[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] #[Template( '{{subject}} must be formatted as {{formatted}}', '{{subject}} must not be formatted as {{formatted}}', )] +#[Assurance(type: ['scalar', Stringable::class])] final readonly class Format implements Validator { public function __construct( diff --git a/src/Validators/Formatted.php b/src/Validators/Formatted.php index eda66f220..c8edb5cf4 100644 --- a/src/Validators/Formatted.php +++ b/src/Validators/Formatted.php @@ -11,13 +11,16 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\StringFormatter\Formatter; use Respect\Validation\Result; use Respect\Validation\Validator; +use Stringable; #[Composable(without: [All::class, Key::class, Property::class])] #[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] +#[Assurance(type: ['scalar', Stringable::class])] final readonly class Formatted implements Validator { public function __construct( diff --git a/src/Validators/Graph.php b/src/Validators/Graph.php index 4c0c40de5..772b17224 100644 --- a/src/Validators/Graph.php +++ b/src/Validators/Graph.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\FilteredString; @@ -32,6 +33,7 @@ '{{subject}} must not consist only of printable non-spacing characters or {{additionalChars}}', self::TEMPLATE_EXTRA, )] +#[Assurance(type: 'scalar')] final class Graph extends FilteredString { protected function isValid(string $input): bool diff --git a/src/Validators/Hetu.php b/src/Validators/Hetu.php index c3025f403..c9203f164 100644 --- a/src/Validators/Hetu.php +++ b/src/Validators/Hetu.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Helpers\CanValidateDateTime; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -27,6 +28,7 @@ '{{subject}} must be a Finnish personal identity code', '{{subject}} must not be a Finnish personal identity code', )] +#[Assurance(type: 'string')] final class Hetu extends Simple { use CanValidateDateTime; diff --git a/src/Validators/HexRgbColor.php b/src/Validators/HexRgbColor.php index 5203ee073..34b423b07 100644 --- a/src/Validators/HexRgbColor.php +++ b/src/Validators/HexRgbColor.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Envelope; @@ -21,6 +22,7 @@ '{{subject}} must be a hex RGB color', '{{subject}} must not be a hex RGB color', )] +#[Assurance(type: 'scalar')] final class HexRgbColor extends Envelope { public function __construct() diff --git a/src/Validators/Iban.php b/src/Validators/Iban.php index 5f0d5eeec..b28fbedb9 100644 --- a/src/Validators/Iban.php +++ b/src/Validators/Iban.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -31,6 +32,7 @@ '{{subject}} must be an IBAN', '{{subject}} must not be an IBAN', )] +#[Assurance(type: 'string')] final class Iban extends Simple { private const array COUNTRIES_LENGTHS = [ diff --git a/src/Validators/Identical.php b/src/Validators/Identical.php index 2fed245c8..dd60a88a6 100644 --- a/src/Validators/Identical.php +++ b/src/Validators/Identical.php @@ -15,6 +15,9 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; +use Respect\Fluent\Attributes\AssuranceFrom; +use Respect\Fluent\Attributes\AssuranceParameter; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Result; @@ -26,9 +29,11 @@ '{{subject}} must be identical to {{compareTo}}', '{{subject}} must not be identical to {{compareTo}}', )] +#[Assurance(from: AssuranceFrom::Value)] final readonly class Identical implements Validator { public function __construct( + #[AssuranceParameter] private mixed $compareTo, ) { } diff --git a/src/Validators/Image.php b/src/Validators/Image.php index da81a7da0..5ffefe3ef 100644 --- a/src/Validators/Image.php +++ b/src/Validators/Image.php @@ -15,6 +15,7 @@ use Attribute; use finfo; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -31,6 +32,7 @@ '{{subject}} must be an accessible existing image file', '{{subject}} must not be an accessible existing image file', )] +#[Assurance(type: ['string', SplFileInfo::class])] final readonly class Image implements Validator { public function evaluate(mixed $input): Result diff --git a/src/Validators/Imei.php b/src/Validators/Imei.php index 9f8b4ae6a..ae7b19ead 100644 --- a/src/Validators/Imei.php +++ b/src/Validators/Imei.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -27,6 +28,7 @@ '{{subject}} must be an IMEI number', '{{subject}} must not be an IMEI number', )] +#[Assurance(type: 'scalar')] final class Imei extends Simple { private const int IMEI_SIZE = 15; diff --git a/src/Validators/Infinite.php b/src/Validators/Infinite.php index 0d7ff13a3..eaff0a239 100644 --- a/src/Validators/Infinite.php +++ b/src/Validators/Infinite.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -28,6 +29,7 @@ '{{subject}} must be an infinite number', '{{subject}} must not be an infinite number', )] +#[Assurance(type: 'int|float|numeric-string')] final class Infinite extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Instance.php b/src/Validators/Instance.php index 5c63858fa..a2d626c8c 100644 --- a/src/Validators/Instance.php +++ b/src/Validators/Instance.php @@ -15,6 +15,9 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; +use Respect\Fluent\Attributes\AssuranceFrom; +use Respect\Fluent\Attributes\AssuranceParameter; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -24,10 +27,12 @@ '{{subject}} must be an instance of {{class|quote}}', '{{subject}} must not be an instance of {{class|quote}}', )] +#[Assurance(from: AssuranceFrom::TypeString)] final readonly class Instance implements Validator { /** @param class-string $class */ public function __construct( + #[AssuranceParameter] private string $class, ) { } diff --git a/src/Validators/IntType.php b/src/Validators/IntType.php index 85ad69e57..16ccf8461 100644 --- a/src/Validators/IntType.php +++ b/src/Validators/IntType.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -24,6 +25,7 @@ '{{subject}} must be an integer', '{{subject}} must not be an integer', )] +#[Assurance(type: 'int')] final class IntType extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/IntVal.php b/src/Validators/IntVal.php index d20783cc8..94b52b226 100644 --- a/src/Validators/IntVal.php +++ b/src/Validators/IntVal.php @@ -20,6 +20,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -32,6 +33,7 @@ '{{subject}} must be an integer', '{{subject}} must not be an integer', )] +#[Assurance(type: 'int|numeric-string')] final class IntVal extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Ip.php b/src/Validators/Ip.php index f4c26e2b9..3c0971778 100644 --- a/src/Validators/Ip.php +++ b/src/Validators/Ip.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Message\Template; use Respect\Validation\Result; @@ -49,6 +50,7 @@ '{{subject}} must not be an IP address in the {{range|raw}} range', self::TEMPLATE_NETWORK_RANGE, )] +#[Assurance(type: 'string')] final class Ip implements Validator { public const string TEMPLATE_NETWORK_RANGE = '__network_range__'; diff --git a/src/Validators/Isbn.php b/src/Validators/Isbn.php index a9c8716be..b05cf573f 100644 --- a/src/Validators/Isbn.php +++ b/src/Validators/Isbn.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -26,6 +27,7 @@ '{{subject}} must be an ISBN', '{{subject}} must not be an ISBN', )] +#[Assurance(type: 'scalar')] final class Isbn extends Simple { /** @see https://howtodoinjava.com/regex/java-regex-validate-international-standard-book-number-isbns */ diff --git a/src/Validators/IterableType.php b/src/Validators/IterableType.php index 249b98359..d6c45650d 100644 --- a/src/Validators/IterableType.php +++ b/src/Validators/IterableType.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -25,6 +26,7 @@ '{{subject}} must be iterable', '{{subject}} must not iterable', )] +#[Assurance(type: 'iterable')] final class IterableType extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/IterableVal.php b/src/Validators/IterableVal.php index a8b39f7b3..d7b80428e 100644 --- a/src/Validators/IterableVal.php +++ b/src/Validators/IterableVal.php @@ -16,15 +16,19 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Helpers\CanValidateIterable; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; +use stdClass; +use Traversable; #[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] #[Template( '{{subject}} must be iterable', '{{subject}} must not be iterable', )] +#[Assurance(type: ['array', stdClass::class, Traversable::class])] final class IterableVal extends Simple { use CanValidateIterable; diff --git a/src/Validators/Json.php b/src/Validators/Json.php index 643f80052..9e9eea5f5 100644 --- a/src/Validators/Json.php +++ b/src/Validators/Json.php @@ -20,6 +20,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -31,6 +32,7 @@ '{{subject}} must be a JSON string', '{{subject}} must not be a JSON string', )] +#[Assurance(type: 'string')] final class Json extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Key.php b/src/Validators/Key.php index 0308d1b5d..16fcede90 100644 --- a/src/Validators/Key.php +++ b/src/Validators/Key.php @@ -15,7 +15,11 @@ namespace Respect\Validation\Validators; +use ArrayAccess; use Attribute; +use Respect\Fluent\Attributes\Assurance; +use Respect\Fluent\Attributes\AssuranceSubject; +use Respect\Fluent\Attributes\AssuranceSubjectMode; use Respect\Fluent\Attributes\Composable; use Respect\Fluent\Attributes\ComposableParameter; use Respect\Validation\Path; @@ -25,6 +29,8 @@ #[Composable(prefix: self::class, without: [All::class, self::class, Property::class])] #[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] +#[Assurance(type: ['array', ArrayAccess::class])] +#[AssuranceSubject(AssuranceSubjectMode::Container)] final readonly class Key implements KeyRelated { public function __construct( diff --git a/src/Validators/KeyExists.php b/src/Validators/KeyExists.php index f7bf8462b..1e870eb4f 100644 --- a/src/Validators/KeyExists.php +++ b/src/Validators/KeyExists.php @@ -13,6 +13,7 @@ use ArrayAccess; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Path; @@ -29,6 +30,7 @@ '{{subject}} must be present', '{{subject}} must not be present', )] +#[Assurance(type: ['array', ArrayAccess::class])] final class KeyExists implements Validator, KeyRelated { public function __construct( diff --git a/src/Validators/KeySet.php b/src/Validators/KeySet.php index 5f878d044..0a92e46cc 100644 --- a/src/Validators/KeySet.php +++ b/src/Validators/KeySet.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Helpers\CanEvaluateShortCircuit; @@ -54,6 +55,7 @@ '{{subject}} contains no missing keys', self::TEMPLATE_MISSING_KEYS, )] +#[Assurance(type: 'array')] final readonly class KeySet implements ShortCircuitable { use CanEvaluateShortCircuit; diff --git a/src/Validators/LanguageCode.php b/src/Validators/LanguageCode.php index 18bf3574a..81b563114 100644 --- a/src/Validators/LanguageCode.php +++ b/src/Validators/LanguageCode.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Exceptions\MissingComposerDependencyException; use Respect\Validation\Message\Template; @@ -30,6 +31,7 @@ '{{subject}} must be a language code', '{{subject}} must not be a language code', )] +#[Assurance(type: 'string')] final readonly class LanguageCode implements Validator { private Languages $languages; diff --git a/src/Validators/LeapDate.php b/src/Validators/LeapDate.php index 08c608826..f4aae03cb 100644 --- a/src/Validators/LeapDate.php +++ b/src/Validators/LeapDate.php @@ -18,6 +18,7 @@ use Attribute; use DateTimeImmutable; use DateTimeInterface; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -28,6 +29,7 @@ '{{subject}} must be a leap date', '{{subject}} must not be a leap date', )] +#[Assurance(type: ['scalar', DateTimeInterface::class])] final class LeapDate extends Simple { public function __construct( diff --git a/src/Validators/LeapYear.php b/src/Validators/LeapYear.php index b0fafefaf..c60774a09 100644 --- a/src/Validators/LeapYear.php +++ b/src/Validators/LeapYear.php @@ -17,6 +17,7 @@ use Attribute; use DateTimeInterface; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -31,6 +32,7 @@ '{{subject}} must be a leap year', '{{subject}} must not be a leap year', )] +#[Assurance(type: ['scalar', DateTimeInterface::class])] final class LeapYear extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Length.php b/src/Validators/Length.php index 5f7eead39..33d9223d8 100644 --- a/src/Validators/Length.php +++ b/src/Validators/Length.php @@ -20,6 +20,9 @@ use Attribute; use Countable as PhpCountable; +use Respect\Fluent\Attributes\Assurance; +use Respect\Fluent\Attributes\AssuranceSubject; +use Respect\Fluent\Attributes\AssuranceSubjectMode; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Result; @@ -42,6 +45,8 @@ '{{subject}} must not be countable or a string', self::TEMPLATE_WRONG_TYPE, )] +#[Assurance(type: ['string', 'array', PhpCountable::class])] +#[AssuranceSubject(AssuranceSubjectMode::Container)] final readonly class Length implements Validator { public const string TEMPLATE_WRONG_TYPE = '__wrong_type__'; diff --git a/src/Validators/Lowercase.php b/src/Validators/Lowercase.php index dddd38ce3..d7031879d 100644 --- a/src/Validators/Lowercase.php +++ b/src/Validators/Lowercase.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -27,6 +28,7 @@ '{{subject}} must consist only of lowercase letters', '{{subject}} must not consist only of lowercase letters', )] +#[Assurance(type: 'string')] final class Lowercase extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Luhn.php b/src/Validators/Luhn.php index f77197f80..f28931ad4 100644 --- a/src/Validators/Luhn.php +++ b/src/Validators/Luhn.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -28,6 +29,7 @@ '{{subject}} must be a Luhn number', '{{subject}} must not be a Luhn number', )] +#[Assurance(type: 'scalar')] final class Luhn extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/MacAddress.php b/src/Validators/MacAddress.php index 158d07858..40f610005 100644 --- a/src/Validators/MacAddress.php +++ b/src/Validators/MacAddress.php @@ -18,6 +18,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -29,6 +30,7 @@ '{{subject}} must be a MAC address', '{{subject}} must not be a MAC address', )] +#[Assurance(type: 'string')] final class MacAddress extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Max.php b/src/Validators/Max.php index d31f30374..0088e0406 100644 --- a/src/Validators/Max.php +++ b/src/Validators/Max.php @@ -15,6 +15,9 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; +use Respect\Fluent\Attributes\AssuranceSubject; +use Respect\Fluent\Attributes\AssuranceSubjectMode; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Result; @@ -25,6 +28,8 @@ #[Composable(prefix: self::class, optIn: true)] #[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] #[Template('The maximum of', 'The maximum of')] +#[Assurance(type: 'iterable')] +#[AssuranceSubject(AssuranceSubjectMode::Container)] final class Max extends FilteredArray { /** @param non-empty-array $input */ diff --git a/src/Validators/Mimetype.php b/src/Validators/Mimetype.php index affef309c..e0709de89 100644 --- a/src/Validators/Mimetype.php +++ b/src/Validators/Mimetype.php @@ -14,6 +14,7 @@ use Attribute; use finfo; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -29,6 +30,7 @@ '{{subject}} must have the {{mimetype}} MIME type', '{{subject}} must not have the {{mimetype}} MIME type', )] +#[Assurance(type: ['string', SplFileInfo::class])] final readonly class Mimetype implements Validator { public function __construct( diff --git a/src/Validators/Min.php b/src/Validators/Min.php index 6d1812cbf..82f812d64 100644 --- a/src/Validators/Min.php +++ b/src/Validators/Min.php @@ -15,6 +15,9 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; +use Respect\Fluent\Attributes\AssuranceSubject; +use Respect\Fluent\Attributes\AssuranceSubjectMode; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Result; @@ -25,6 +28,8 @@ #[Composable(prefix: self::class, optIn: true)] #[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] #[Template('The minimum of', 'The minimum of')] +#[Assurance(type: 'iterable')] +#[AssuranceSubject(AssuranceSubjectMode::Container)] final class Min extends FilteredArray { /** @param non-empty-array $input */ diff --git a/src/Validators/Negative.php b/src/Validators/Negative.php index 6eebb5ee4..f03ea6ae5 100644 --- a/src/Validators/Negative.php +++ b/src/Validators/Negative.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -25,6 +26,7 @@ '{{subject}} must be a negative number', '{{subject}} must not be a negative number', )] +#[Assurance(type: 'int|float|numeric-string')] final class Negative extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/NfeAccessKey.php b/src/Validators/NfeAccessKey.php index 33dcc0139..d99d5c38e 100644 --- a/src/Validators/NfeAccessKey.php +++ b/src/Validators/NfeAccessKey.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -29,6 +30,7 @@ '{{subject}} must be a NFe access key', '{{subject}} must not be a NFe access key', )] +#[Assurance(type: 'string')] final class NfeAccessKey extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Nif.php b/src/Validators/Nif.php index ef01ae7b8..169b7f76d 100644 --- a/src/Validators/Nif.php +++ b/src/Validators/Nif.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -31,6 +32,7 @@ '{{subject}} must be a NIF', '{{subject}} must not be a NIF', )] +#[Assurance(type: 'string')] final class Nif extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Nip.php b/src/Validators/Nip.php index fa015a0a0..c6a498319 100644 --- a/src/Validators/Nip.php +++ b/src/Validators/Nip.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -27,6 +28,7 @@ '{{subject}} must be a Polish VAT identification number', '{{subject}} must not be a Polish VAT identification number', )] +#[Assurance(type: 'scalar')] final class Nip extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/NullOr.php b/src/Validators/NullOr.php index 072712b68..0f7fec378 100644 --- a/src/Validators/NullOr.php +++ b/src/Validators/NullOr.php @@ -14,6 +14,9 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; +use Respect\Fluent\Attributes\AssuranceSubject; +use Respect\Fluent\Attributes\AssuranceSubjectMode; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Result; @@ -30,6 +33,8 @@ 'or must be null', 'and must not be null', )] +#[Assurance(type: 'null')] +#[AssuranceSubject(AssuranceSubjectMode::Wrap)] final readonly class NullOr implements Validator { public function __construct( diff --git a/src/Validators/NullType.php b/src/Validators/NullType.php index d6c15df8c..da29bd2ee 100644 --- a/src/Validators/NullType.php +++ b/src/Validators/NullType.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -22,6 +23,7 @@ '{{subject}} must be null', '{{subject}} must not be null', )] +#[Assurance(type: 'null')] final class NullType extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Number.php b/src/Validators/Number.php index eac0169fa..220a88c70 100644 --- a/src/Validators/Number.php +++ b/src/Validators/Number.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -28,6 +29,7 @@ '{{subject}} must be a number', '{{subject}} must not be a number', )] +#[Assurance(type: 'int|float|numeric-string')] final class Number extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/NumericVal.php b/src/Validators/NumericVal.php index 5a5f27253..94d103981 100644 --- a/src/Validators/NumericVal.php +++ b/src/Validators/NumericVal.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -25,6 +26,7 @@ '{{subject}} must be numeric', '{{subject}} must not be numeric', )] +#[Assurance(type: 'int|float|numeric-string')] final class NumericVal extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/ObjectType.php b/src/Validators/ObjectType.php index 5c9dfccaa..5ac989ac6 100644 --- a/src/Validators/ObjectType.php +++ b/src/Validators/ObjectType.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -24,6 +25,7 @@ '{{subject}} must be an object', '{{subject}} must not be an object', )] +#[Assurance(type: 'object')] final class ObjectType extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Odd.php b/src/Validators/Odd.php index 231b929aa..de3e6d771 100644 --- a/src/Validators/Odd.php +++ b/src/Validators/Odd.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -32,6 +33,7 @@ '{{subject}} must be an odd number', '{{subject}} must be an even number', )] +#[Assurance(type: 'int|float|numeric-string')] final class Odd extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Pesel.php b/src/Validators/Pesel.php index 67f2421bc..9cb0edbdd 100644 --- a/src/Validators/Pesel.php +++ b/src/Validators/Pesel.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -25,6 +26,7 @@ '{{subject}} must be a PESEL', '{{subject}} must not be a PESEL', )] +#[Assurance(type: 'scalar')] final class Pesel extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Phone.php b/src/Validators/Phone.php index 7778c2339..489800b3a 100644 --- a/src/Validators/Phone.php +++ b/src/Validators/Phone.php @@ -21,6 +21,7 @@ use Attribute; use libphonenumber\NumberParseException; use libphonenumber\PhoneNumberUtil; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Exceptions\MissingComposerDependencyException; use Respect\Validation\Message\Template; @@ -42,6 +43,7 @@ '{{subject}} must not be a phone number for country {{countryName|trans}}', self::TEMPLATE_FOR_COUNTRY, )] +#[Assurance(type: 'scalar')] final class Phone implements Validator { public const string TEMPLATE_FOR_COUNTRY = '__for_country__'; diff --git a/src/Validators/Pis.php b/src/Validators/Pis.php index 9ddfbdbf2..17ca3e05a 100644 --- a/src/Validators/Pis.php +++ b/src/Validators/Pis.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -27,6 +28,7 @@ '{{subject}} must be a PIS number', '{{subject}} must not be a PIS number', )] +#[Assurance(type: 'scalar')] final class Pis extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/PolishIdCard.php b/src/Validators/PolishIdCard.php index 602a1267a..b6ed18da5 100644 --- a/src/Validators/PolishIdCard.php +++ b/src/Validators/PolishIdCard.php @@ -12,6 +12,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -25,6 +26,7 @@ '{{subject}} must be a Polish Identity Card number', '{{subject}} must not be a Polish Identity Card number', )] +#[Assurance(type: 'scalar')] final class PolishIdCard extends Simple { private const int ASCII_CODE_0 = 48; diff --git a/src/Validators/PortugueseNif.php b/src/Validators/PortugueseNif.php index c163d8d0a..9b4fb7aca 100644 --- a/src/Validators/PortugueseNif.php +++ b/src/Validators/PortugueseNif.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -32,6 +33,7 @@ '{{subject}} must be a Portuguese NIF', '{{subject}} must not be a Portuguese NIF', )] +#[Assurance(type: 'string')] final class PortugueseNif extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Positive.php b/src/Validators/Positive.php index 88b010332..9607a69b1 100644 --- a/src/Validators/Positive.php +++ b/src/Validators/Positive.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -27,6 +28,7 @@ '{{subject}} must be a positive number', '{{subject}} must not be a positive number', )] +#[Assurance(type: 'int|float|numeric-string')] final class Positive extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/PostalCode.php b/src/Validators/PostalCode.php index 9c74df8ab..b1f4c0526 100644 --- a/src/Validators/PostalCode.php +++ b/src/Validators/PostalCode.php @@ -26,6 +26,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Helpers\DataLoader; use Respect\Validation\Message\Template; @@ -37,6 +38,7 @@ '{{subject}} must be a postal code for {{countryCode}}', '{{subject}} must not be a postal code for {{countryCode}}', )] +#[Assurance(type: 'scalar')] final class PostalCode extends Envelope { private const array POSTAL_CODES_EXTRA = [ diff --git a/src/Validators/Printable.php b/src/Validators/Printable.php index df6fa7a7b..ee6f8d26f 100644 --- a/src/Validators/Printable.php +++ b/src/Validators/Printable.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\FilteredString; @@ -32,6 +33,7 @@ '{{subject}} must not consist only of printable characters or {{additionalChars}}', self::TEMPLATE_EXTRA, )] +#[Assurance(type: 'scalar')] final class Printable extends FilteredString { protected function isValid(string $input): bool diff --git a/src/Validators/Property.php b/src/Validators/Property.php index 273f11706..1bf4b7d99 100644 --- a/src/Validators/Property.php +++ b/src/Validators/Property.php @@ -19,6 +19,9 @@ use Attribute; use ReflectionClass; use ReflectionObject; +use Respect\Fluent\Attributes\Assurance; +use Respect\Fluent\Attributes\AssuranceSubject; +use Respect\Fluent\Attributes\AssuranceSubjectMode; use Respect\Fluent\Attributes\Composable; use Respect\Fluent\Attributes\ComposableParameter; use Respect\Validation\Path; @@ -27,6 +30,8 @@ #[Composable(prefix: self::class, without: [All::class, Key::class, self::class])] #[Attribute(Attribute::TARGET_PROPERTY | Attribute::IS_REPEATABLE)] +#[Assurance(type: 'object')] +#[AssuranceSubject(AssuranceSubjectMode::Container)] final readonly class Property implements Validator { public function __construct( diff --git a/src/Validators/PropertyExists.php b/src/Validators/PropertyExists.php index d207ece8d..e01f1bc48 100644 --- a/src/Validators/PropertyExists.php +++ b/src/Validators/PropertyExists.php @@ -14,6 +14,7 @@ use Attribute; use ReflectionClass; use ReflectionObject; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Message\Template; use Respect\Validation\Path; @@ -28,6 +29,7 @@ '{{subject}} must be present', '{{subject}} must not be present', )] +#[Assurance(type: 'object')] final readonly class PropertyExists implements Validator { public function __construct( diff --git a/src/Validators/PublicDomainSuffix.php b/src/Validators/PublicDomainSuffix.php index 002f88d86..4b1fb70e8 100644 --- a/src/Validators/PublicDomainSuffix.php +++ b/src/Validators/PublicDomainSuffix.php @@ -12,6 +12,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Helpers\DataLoader; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -36,6 +37,7 @@ '{{subject}} must be a public domain suffix', '{{subject}} must not be a public domain suffix', )] +#[Assurance(type: 'scalar')] final class PublicDomainSuffix extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Punct.php b/src/Validators/Punct.php index b781f299d..076ec30ef 100644 --- a/src/Validators/Punct.php +++ b/src/Validators/Punct.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\FilteredString; @@ -32,6 +33,7 @@ '{{subject}} must not consist only of punctuation characters or {{additionalChars}}', self::TEMPLATE_EXTRA, )] +#[Assurance(type: 'scalar')] final class Punct extends FilteredString { protected function isValid(string $input): bool diff --git a/src/Validators/Readable.php b/src/Validators/Readable.php index 641e50812..2424ecb31 100644 --- a/src/Validators/Readable.php +++ b/src/Validators/Readable.php @@ -17,6 +17,7 @@ use Attribute; use Psr\Http\Message\StreamInterface; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; use SplFileInfo; @@ -29,6 +30,7 @@ '{{subject}} must be readable', '{{subject}} must not be readable', )] +#[Assurance(type: ['string', SplFileInfo::class, StreamInterface::class])] final class Readable extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Regex.php b/src/Validators/Regex.php index 679d277b3..73075b96e 100644 --- a/src/Validators/Regex.php +++ b/src/Validators/Regex.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -28,6 +29,7 @@ '{{subject}} must match the {{regex|quote}} pattern', '{{subject}} must not match the {{regex|quote}} pattern', )] +#[Assurance(type: 'scalar')] final readonly class Regex implements Validator { public function __construct( diff --git a/src/Validators/ResourceType.php b/src/Validators/ResourceType.php index 5fcd6a767..d78fa50a9 100644 --- a/src/Validators/ResourceType.php +++ b/src/Validators/ResourceType.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -24,6 +25,7 @@ '{{subject}} must be an internal resource', '{{subject}} must not be an internal resource', )] +#[Assurance(type: 'resource')] final class ResourceType extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Roman.php b/src/Validators/Roman.php index d1c7959f2..73ea46b1a 100644 --- a/src/Validators/Roman.php +++ b/src/Validators/Roman.php @@ -18,6 +18,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Envelope; @@ -26,6 +27,7 @@ '{{subject}} must be a Roman numeral', '{{subject}} must not be a Roman numeral', )] +#[Assurance(type: 'string')] final class Roman extends Envelope { public function __construct() diff --git a/src/Validators/ScalarVal.php b/src/Validators/ScalarVal.php index 2edbcefd1..e7f2fc9d7 100644 --- a/src/Validators/ScalarVal.php +++ b/src/Validators/ScalarVal.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -24,6 +25,7 @@ '{{subject}} must be a scalar', '{{subject}} must not be a scalar', )] +#[Assurance(type: 'int|float|bool|string')] final class ScalarVal extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Size.php b/src/Validators/Size.php index 93c3156aa..e567933bd 100644 --- a/src/Validators/Size.php +++ b/src/Validators/Size.php @@ -16,6 +16,7 @@ use Attribute; use Psr\Http\Message\StreamInterface; use Psr\Http\Message\UploadedFileInterface; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Message\Template; use Respect\Validation\Result; @@ -36,6 +37,7 @@ '{{subject}} must not be a filename, an instance of SplFileInfo or a PSR-7 interface', self::TEMPLATE_WRONG_TYPE, )] +#[Assurance(type: ['string', SplFileInfo::class, UploadedFileInterface::class, StreamInterface::class])] final readonly class Size implements Validator { public const string TEMPLATE_WRONG_TYPE = '__wrong_type__'; diff --git a/src/Validators/Slug.php b/src/Validators/Slug.php index dfd9f2b7e..f849f965a 100644 --- a/src/Validators/Slug.php +++ b/src/Validators/Slug.php @@ -19,6 +19,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -31,6 +32,7 @@ '{{subject}} must be a slug', '{{subject}} must not be a slug', )] +#[Assurance(type: 'string')] final class Slug extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Sorted.php b/src/Validators/Sorted.php index b8debd798..222783c71 100644 --- a/src/Validators/Sorted.php +++ b/src/Validators/Sorted.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Message\Template; use Respect\Validation\Result; @@ -35,6 +36,7 @@ '{{subject}} must not be sorted in descending order', self::TEMPLATE_DESCENDING, )] +#[Assurance(type: 'array|string')] final readonly class Sorted implements Validator { public const string TEMPLATE_ASCENDING = '__ascending__'; diff --git a/src/Validators/Space.php b/src/Validators/Space.php index b39cb6503..4893bae6d 100644 --- a/src/Validators/Space.php +++ b/src/Validators/Space.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\FilteredString; @@ -32,6 +33,7 @@ '{{subject}} must not consist only of space characters or {{additionalChars}}', self::TEMPLATE_EXTRA, )] +#[Assurance(type: 'scalar')] final class Space extends FilteredString { protected function isValid(string $input): bool diff --git a/src/Validators/Spaced.php b/src/Validators/Spaced.php index b8c020d4c..a407b2a76 100644 --- a/src/Validators/Spaced.php +++ b/src/Validators/Spaced.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -27,6 +28,7 @@ '{{subject}} must contain at least one whitespace', '{{subject}} must not contain whitespace', )] +#[Assurance(type: 'string')] final class Spaced extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/StartsWith.php b/src/Validators/StartsWith.php index 6b9d48cd6..33a5d587d 100644 --- a/src/Validators/StartsWith.php +++ b/src/Validators/StartsWith.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -36,6 +37,7 @@ '{{subject}} must not start with {{startValues|list:or}}', self::TEMPLATE_MULTIPLE_VALUES, )] +#[Assurance(type: 'array|string')] final readonly class StartsWith implements Validator { public const string TEMPLATE_MULTIPLE_VALUES = '__multiple_values__'; diff --git a/src/Validators/StringType.php b/src/Validators/StringType.php index 50bc93356..e9d456c2a 100644 --- a/src/Validators/StringType.php +++ b/src/Validators/StringType.php @@ -14,6 +14,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -24,6 +25,7 @@ '{{subject}} must be a string', '{{subject}} must not be a string', )] +#[Assurance(type: 'string')] final class StringType extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/StringVal.php b/src/Validators/StringVal.php index 9126ce561..4c2270a02 100644 --- a/src/Validators/StringVal.php +++ b/src/Validators/StringVal.php @@ -17,8 +17,10 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; +use Stringable; use function is_object; use function is_scalar; @@ -29,6 +31,7 @@ '{{subject}} must be a string', '{{subject}} must not be a string', )] +#[Assurance(type: ['scalar', Stringable::class])] final class StringVal extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/SubdivisionCode.php b/src/Validators/SubdivisionCode.php index 939ca22a2..968849681 100644 --- a/src/Validators/SubdivisionCode.php +++ b/src/Validators/SubdivisionCode.php @@ -12,6 +12,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Exceptions\MissingComposerDependencyException; use Respect\Validation\Helpers\CanValidateUndefined; @@ -28,6 +29,7 @@ '{{subject}} must be a subdivision code of {{countryName|trans}}', '{{subject}} must not be a subdivision code of {{countryName|trans}}', )] +#[Assurance(type: 'scalar|null')] final readonly class SubdivisionCode implements Validator { use CanValidateUndefined; diff --git a/src/Validators/Subset.php b/src/Validators/Subset.php index dbde4cdf0..1897663b8 100644 --- a/src/Validators/Subset.php +++ b/src/Validators/Subset.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -29,6 +30,7 @@ '{{subject}} must be subset of {{superset}}', '{{subject}} must not be subset of {{superset}}', )] +#[Assurance(type: 'array')] final readonly class Subset implements Validator { /** @param mixed[] $superset */ diff --git a/src/Validators/SymbolicLink.php b/src/Validators/SymbolicLink.php index fc7513260..6b8aa619e 100644 --- a/src/Validators/SymbolicLink.php +++ b/src/Validators/SymbolicLink.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; use SplFileInfo; @@ -27,6 +28,7 @@ '{{subject}} must be an accessible existing symbolic link', '{{subject}} must not be an accessible existing symbolic link', )] +#[Assurance(type: ['string', SplFileInfo::class])] final class SymbolicLink extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Time.php b/src/Validators/Time.php index 297c4439a..353560fa8 100644 --- a/src/Validators/Time.php +++ b/src/Validators/Time.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Helpers\CanValidateDateTime; use Respect\Validation\Message\Template; @@ -33,6 +34,7 @@ '{{subject}} must be a time in the {{sample}} format', '{{subject}} must not be a time in the {{sample}} format', )] +#[Assurance(type: 'scalar')] final readonly class Time implements Validator { use CanValidateDateTime; diff --git a/src/Validators/Tld.php b/src/Validators/Tld.php index 9221bed8a..af9f52a94 100644 --- a/src/Validators/Tld.php +++ b/src/Validators/Tld.php @@ -20,6 +20,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Helpers\DataLoader; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Envelope; @@ -29,6 +30,7 @@ '{{subject}} must be a top-level domain name', '{{subject}} must not be a top-level domain name', )] +#[Assurance(type: 'string')] final class Tld extends Envelope { public function __construct() diff --git a/src/Validators/Trimmed.php b/src/Validators/Trimmed.php index 88588aa1b..d3ef59c5a 100644 --- a/src/Validators/Trimmed.php +++ b/src/Validators/Trimmed.php @@ -11,6 +11,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validator; use Respect\Validation\Validators\Core\Envelope; @@ -26,6 +27,7 @@ '{{subject}} must contain leading or trailing {{trimValues|list:or}}', self::TEMPLATE_CUSTOM, )] +#[Assurance(type: 'string')] final class Trimmed extends Envelope { public const string TEMPLATE_CUSTOM = '__custom__'; diff --git a/src/Validators/TrueVal.php b/src/Validators/TrueVal.php index 7d99308f7..7ab670cc4 100644 --- a/src/Validators/TrueVal.php +++ b/src/Validators/TrueVal.php @@ -13,6 +13,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -26,6 +27,7 @@ '{{subject}} must evaluate to `true`', '{{subject}} must not evaluate to `true`', )] +#[Assurance(type: 'scalar')] final class TrueVal extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Undef.php b/src/Validators/Undef.php index 19905afaa..4051baf26 100644 --- a/src/Validators/Undef.php +++ b/src/Validators/Undef.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Helpers\CanValidateUndefined; use Respect\Validation\Message\Template; @@ -28,6 +29,7 @@ '{{subject}} must be undefined', '{{subject}} must be defined', )] +#[Assurance(type: "null|''")] final class Undef implements Validator { use CanValidateUndefined; diff --git a/src/Validators/UndefOr.php b/src/Validators/UndefOr.php index ce8610eef..b4a334d63 100644 --- a/src/Validators/UndefOr.php +++ b/src/Validators/UndefOr.php @@ -13,6 +13,9 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; +use Respect\Fluent\Attributes\AssuranceSubject; +use Respect\Fluent\Attributes\AssuranceSubjectMode; use Respect\Fluent\Attributes\Composable; use Respect\Validation\Helpers\CanValidateUndefined; use Respect\Validation\Message\Template; @@ -30,6 +33,8 @@ 'or must be undefined', 'and must not be undefined', )] +#[Assurance(type: "null|''")] +#[AssuranceSubject(AssuranceSubjectMode::Wrap)] final readonly class UndefOr implements Validator { use CanValidateUndefined; diff --git a/src/Validators/Unique.php b/src/Validators/Unique.php index 724539bb5..c31fb7686 100644 --- a/src/Validators/Unique.php +++ b/src/Validators/Unique.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -29,6 +30,7 @@ '{{subject}} must not contain duplicates', '{{subject}} must contain duplicates', )] +#[Assurance(type: 'array')] final class Unique extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Uppercase.php b/src/Validators/Uppercase.php index 5ae7785f0..42bb6a418 100644 --- a/src/Validators/Uppercase.php +++ b/src/Validators/Uppercase.php @@ -16,6 +16,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -27,6 +28,7 @@ '{{subject}} must consist only of uppercase letters', '{{subject}} must not consist only of uppercase letters', )] +#[Assurance(type: 'string')] final class Uppercase extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Url.php b/src/Validators/Url.php index 92600a2ab..456d1cdbb 100644 --- a/src/Validators/Url.php +++ b/src/Validators/Url.php @@ -12,6 +12,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Result; use Respect\Validation\Validator; @@ -26,6 +27,7 @@ '{{subject}} must be a URL', '{{subject}} must not be a URL', )] +#[Assurance(type: 'string')] final class Url implements Validator { private readonly Validator $validator; diff --git a/src/Validators/Uuid.php b/src/Validators/Uuid.php index 6a5296afd..490d75e8a 100644 --- a/src/Validators/Uuid.php +++ b/src/Validators/Uuid.php @@ -22,6 +22,7 @@ use Ramsey\Uuid\Rfc4122\FieldsInterface; use Ramsey\Uuid\UuidFactory; use Ramsey\Uuid\UuidInterface; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Exceptions\InvalidValidatorException; use Respect\Validation\Exceptions\MissingComposerDependencyException; use Respect\Validation\Message\Template; @@ -43,6 +44,7 @@ '{{subject}} must not be a UUID v{{version|raw}}', self::TEMPLATE_VERSION, )] +#[Assurance(type: ['string', UuidInterface::class])] final class Uuid implements Validator { public const string TEMPLATE_VERSION = '__version__'; diff --git a/src/Validators/Version.php b/src/Validators/Version.php index 62d311db6..7b2343a6a 100644 --- a/src/Validators/Version.php +++ b/src/Validators/Version.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; @@ -27,6 +28,7 @@ '{{subject}} must be a version number', '{{subject}} must not be a version number', )] +#[Assurance(type: 'string')] final class Version extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Vowel.php b/src/Validators/Vowel.php index 699e9695e..74f1b7cb5 100644 --- a/src/Validators/Vowel.php +++ b/src/Validators/Vowel.php @@ -17,6 +17,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\FilteredString; @@ -33,6 +34,7 @@ '{{subject}} must not consist of vowels or {{additionalChars}}', self::TEMPLATE_EXTRA, )] +#[Assurance(type: 'scalar')] final class Vowel extends FilteredString { protected function isValid(string $input): bool diff --git a/src/Validators/Writable.php b/src/Validators/Writable.php index 6f33716a0..221c3d0f2 100644 --- a/src/Validators/Writable.php +++ b/src/Validators/Writable.php @@ -17,6 +17,7 @@ use Attribute; use Psr\Http\Message\StreamInterface; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\Simple; use SplFileInfo; @@ -29,6 +30,7 @@ '{{subject}} must be an accessible existing writable filesystem entry', '{{subject}} must not be an accessible existing writable filesystem entry', )] +#[Assurance(type: ['string', SplFileInfo::class, StreamInterface::class])] final class Writable extends Simple { public function isValid(mixed $input): bool diff --git a/src/Validators/Xdigit.php b/src/Validators/Xdigit.php index 4544c0632..8c7c66e0e 100644 --- a/src/Validators/Xdigit.php +++ b/src/Validators/Xdigit.php @@ -15,6 +15,7 @@ namespace Respect\Validation\Validators; use Attribute; +use Respect\Fluent\Attributes\Assurance; use Respect\Validation\Message\Template; use Respect\Validation\Validators\Core\FilteredString; @@ -31,6 +32,7 @@ '{{subject}} must not consist only of hexadecimal digits or {{additionalChars}}', self::TEMPLATE_EXTRA, )] +#[Assurance(type: 'scalar')] final class Xdigit extends FilteredString { protected function isValid(string $input): bool diff --git a/tests/inference/StaticNarrowingTest.php b/tests/inference/StaticNarrowingTest.php new file mode 100644 index 000000000..e14d2d973 --- /dev/null +++ b/tests/inference/StaticNarrowingTest.php @@ -0,0 +1,36 @@ + */ + public static function getAdditionalConfigFiles(): array + { + return []; + } + + /** @return iterable */ + public static function dataFileAsserts(): iterable + { + yield from self::gatherAssertTypes(__DIR__ . '/assertions/static-narrowing.php'); + } + + #[Test] + #[DataProvider('dataFileAsserts')] + public function fileAsserts(string $assertType, string $file, mixed ...$args): void + { + $this->assertFileAsserts($assertType, $file, ...$args); + } +} diff --git a/tests/inference/assertions/static-narrowing.php b/tests/inference/assertions/static-narrowing.php new file mode 100644 index 000000000..1446545d7 --- /dev/null +++ b/tests/inference/assertions/static-narrowing.php @@ -0,0 +1,908 @@ +assert($x); + assertType('iterable', $x); +} + +function alnumAssert(mixed $x): void +{ + v::alnum()->assert($x); + assertType('bool|float|int|string', $x); +} + +function alphaAssert(mixed $x): void +{ + v::alpha()->assert($x); + assertType('bool|float|int|string', $x); +} + +function arrayTypeAssert(mixed $x): void +{ + v::arrayType()->assert($x); + assertType('array', $x); +} + +function arrayValAssert(mixed $x): void +{ + v::arrayVal()->assert($x); + assertType('array|ArrayAccess', $x); +} + +function attributesAssert(mixed $x): void +{ + v::attributes()->assert($x); + assertType('object', $x); +} + +function base64Assert(mixed $x): void +{ + v::base64()->assert($x); + assertType('string', $x); +} + +function boolTypeAssert(mixed $x): void +{ + v::boolType()->assert($x); + assertType('bool', $x); +} + +function boolValAssert(mixed $x): void +{ + v::boolVal()->assert($x); + assertType('bool|float|int|string|null', $x); +} + +function bsnAssert(mixed $x): void +{ + v::bsn()->assert($x); + assertType('bool|float|int|string', $x); +} + +function callableTypeAssert(mixed $x): void +{ + v::callableType()->assert($x); + assertType('callable(): mixed', $x); +} + +function charsetAssert(mixed $x): void +{ + v::charset('x')->assert($x); + assertType('string', $x); +} + +function cnhAssert(mixed $x): void +{ + v::cnh()->assert($x); + assertType('bool|float|int|string', $x); +} + +function cnpjAssert(mixed $x): void +{ + v::cnpj()->assert($x); + assertType('bool|float|int|string', $x); +} + +function consonantAssert(mixed $x): void +{ + v::consonant()->assert($x); + assertType('bool|float|int|string', $x); +} + +function containsAssert(mixed $x): void +{ + v::contains(1)->assert($x); + assertType('array|bool|float|int|string', $x); +} + +function containsAnyAssert(mixed $x): void +{ + v::containsAny([1, 2, 3])->assert($x); + assertType('array|bool|float|int|string', $x); +} + +function containsCountAssert(mixed $x): void +{ + v::containsCount(1, 1)->assert($x); + assertType('array|bool|float|int|string', $x); +} + +function controlAssert(mixed $x): void +{ + v::control()->assert($x); + assertType('bool|float|int|string', $x); +} + +function countableAssert(mixed $x): void +{ + v::countable()->assert($x); + assertType('array|Countable', $x); +} + +function countryCodeAssert(mixed $x): void +{ + v::countryCode()->assert($x); + assertType('string', $x); +} + +function cpfAssert(mixed $x): void +{ + v::cpf()->assert($x); + assertType('string', $x); +} + +function creditCardAssert(mixed $x): void +{ + v::creditCard()->assert($x); + assertType('bool|float|int|string', $x); +} + +function currencyCodeAssert(mixed $x): void +{ + v::currencyCode()->assert($x); + assertType('string', $x); +} + +function dateAssert(mixed $x): void +{ + v::date()->assert($x); + assertType('bool|float|int|string', $x); +} + +function dateTimeAssert(mixed $x): void +{ + v::dateTime()->assert($x); + assertType('bool|DateTimeInterface|float|int|string', $x); +} + +function dateTimeDiffAssert(mixed $x): void +{ + v::dateTimeDiff('years', v::intType())->assert($x); + assertType('DateTimeInterface|string', $x); +} + +function decimalAssert(mixed $x): void +{ + v::decimal(1)->assert($x); + assertType('float|int|numeric-string', $x); +} + +function digitAssert(mixed $x): void +{ + v::digit()->assert($x); + assertType('bool|float|int|string', $x); +} + +function directoryAssert(mixed $x): void +{ + v::directory()->assert($x); + assertType('SplFileInfo|string', $x); +} + +function domainAssert(mixed $x): void +{ + v::domain()->assert($x); + assertType('string', $x); +} + +function eachAssert(mixed $x): void +{ + v::each(v::intType())->assert($x); + assertType('iterable', $x); +} + +function emailAssert(mixed $x): void +{ + v::email()->assert($x); + assertType('string', $x); +} + +function emojiAssert(mixed $x): void +{ + v::emoji()->assert($x); + assertType('string', $x); +} + +function endsWithAssert(mixed $x): void +{ + v::endsWith(1)->assert($x); + assertType('array|string', $x); +} + +function evenAssert(mixed $x): void +{ + v::even()->assert($x); + assertType('float|int|numeric-string', $x); +} + +function executableAssert(mixed $x): void +{ + v::executable()->assert($x); + assertType('SplFileInfo|string', $x); +} + +function existsAssert(mixed $x): void +{ + v::exists()->assert($x); + assertType('SplFileInfo|string', $x); +} + +function extensionAssert(mixed $x): void +{ + v::extension('x')->assert($x); + assertType('SplFileInfo|string', $x); +} + +function falseValAssert(mixed $x): void +{ + v::falseVal()->assert($x); + assertType('bool|float|int|string|null', $x); +} + +function fileAssert(mixed $x): void +{ + v::file()->assert($x); + assertType('SplFileInfo|string', $x); +} + +function finiteAssert(mixed $x): void +{ + v::finite()->assert($x); + assertType('float|int|numeric-string', $x); +} + +function floatTypeAssert(mixed $x): void +{ + v::floatType()->assert($x); + assertType('float', $x); +} + +function floatValAssert(mixed $x): void +{ + v::floatVal()->assert($x); + assertType('float|int|numeric-string|true', $x); +} + +function graphAssert(mixed $x): void +{ + v::graph()->assert($x); + assertType('bool|float|int|string', $x); +} + +function hetuAssert(mixed $x): void +{ + v::hetu()->assert($x); + assertType('string', $x); +} + +function hexRgbColorAssert(mixed $x): void +{ + v::hexRgbColor()->assert($x); + assertType('bool|float|int|string', $x); +} + +function ibanAssert(mixed $x): void +{ + v::iban()->assert($x); + assertType('string', $x); +} + +function identicalAssert(mixed $x): void +{ + v::identical(42)->assert($x); + assertType('int', $x); +} + +function imageAssert(mixed $x): void +{ + v::image()->assert($x); + assertType('SplFileInfo|string', $x); +} + +function imeiAssert(mixed $x): void +{ + v::imei()->assert($x); + assertType('bool|float|int|string', $x); +} + +function infiniteAssert(mixed $x): void +{ + v::infinite()->assert($x); + assertType('float|int|numeric-string', $x); +} + +function instanceAssert(mixed $x): void +{ + v::instance(\DateTimeInterface::class)->assert($x); + assertType('DateTimeInterface', $x); +} + +function intTypeAssert(mixed $x): void +{ + v::intType()->assert($x); + assertType('int', $x); +} + +function intValAssert(mixed $x): void +{ + v::intVal()->assert($x); + assertType('int|numeric-string', $x); +} + +function ipAssert(mixed $x): void +{ + v::ip()->assert($x); + assertType('string', $x); +} + +function isbnAssert(mixed $x): void +{ + v::isbn()->assert($x); + assertType('bool|float|int|string', $x); +} + +function iterableTypeAssert(mixed $x): void +{ + v::iterableType()->assert($x); + assertType('iterable', $x); +} + +function iterableValAssert(mixed $x): void +{ + v::iterableVal()->assert($x); + assertType('array|stdClass|Traversable', $x); +} + +function jsonAssert(mixed $x): void +{ + v::json()->assert($x); + assertType('string', $x); +} + +function keyExistsAssert(mixed $x): void +{ + v::keyExists(1)->assert($x); + assertType('array|ArrayAccess', $x); +} + +function keySetAssert(mixed $x): void +{ + v::keySet(v::intType())->assert($x); + assertType('array', $x); +} + +function languageCodeAssert(mixed $x): void +{ + v::languageCode()->assert($x); + assertType('string', $x); +} + +function leapDateAssert(mixed $x): void +{ + v::leapDate('x')->assert($x); + assertType('bool|DateTimeInterface|float|int|string', $x); +} + +function leapYearAssert(mixed $x): void +{ + v::leapYear()->assert($x); + assertType('bool|DateTimeInterface|float|int|string', $x); +} + +function lowercaseAssert(mixed $x): void +{ + v::lowercase()->assert($x); + assertType('string', $x); +} + +function luhnAssert(mixed $x): void +{ + v::luhn()->assert($x); + assertType('bool|float|int|string', $x); +} + +function macAddressAssert(mixed $x): void +{ + v::macAddress()->assert($x); + assertType('string', $x); +} + +function mimetypeAssert(mixed $x): void +{ + v::mimetype('x')->assert($x); + assertType('SplFileInfo|string', $x); +} + +function negativeAssert(mixed $x): void +{ + v::negative()->assert($x); + assertType('float|int|numeric-string', $x); +} + +function nfeAccessKeyAssert(mixed $x): void +{ + v::nfeAccessKey()->assert($x); + assertType('string', $x); +} + +function nifAssert(mixed $x): void +{ + v::nif()->assert($x); + assertType('string', $x); +} + +function nipAssert(mixed $x): void +{ + v::nip()->assert($x); + assertType('bool|float|int|string', $x); +} + +function nullTypeAssert(mixed $x): void +{ + v::nullType()->assert($x); + assertType('null', $x); +} + +function numberAssert(mixed $x): void +{ + v::number()->assert($x); + assertType('float|int|numeric-string', $x); +} + +function numericValAssert(mixed $x): void +{ + v::numericVal()->assert($x); + assertType('float|int|numeric-string', $x); +} + +function objectTypeAssert(mixed $x): void +{ + v::objectType()->assert($x); + assertType('object', $x); +} + +function oddAssert(mixed $x): void +{ + v::odd()->assert($x); + assertType('float|int|numeric-string', $x); +} + +function peselAssert(mixed $x): void +{ + v::pesel()->assert($x); + assertType('bool|float|int|string', $x); +} + +function phoneAssert(mixed $x): void +{ + v::phone()->assert($x); + assertType('bool|float|int|string', $x); +} + +function pisAssert(mixed $x): void +{ + v::pis()->assert($x); + assertType('bool|float|int|string', $x); +} + +function polishIdCardAssert(mixed $x): void +{ + v::polishIdCard()->assert($x); + assertType('bool|float|int|string', $x); +} + +function portugueseNifAssert(mixed $x): void +{ + v::portugueseNif()->assert($x); + assertType('string', $x); +} + +function positiveAssert(mixed $x): void +{ + v::positive()->assert($x); + assertType('float|int|numeric-string', $x); +} + +function postalCodeAssert(mixed $x): void +{ + v::postalCode('x')->assert($x); + assertType('bool|float|int|string', $x); +} + +function printableAssert(mixed $x): void +{ + v::printable()->assert($x); + assertType('bool|float|int|string', $x); +} + +function propertyExistsAssert(mixed $x): void +{ + v::propertyExists('x')->assert($x); + assertType('object', $x); +} + +function publicDomainSuffixAssert(mixed $x): void +{ + v::publicDomainSuffix()->assert($x); + assertType('bool|float|int|string', $x); +} + +function punctAssert(mixed $x): void +{ + v::punct()->assert($x); + assertType('bool|float|int|string', $x); +} + +function readableAssert(mixed $x): void +{ + v::readable()->assert($x); + assertType('Psr\Http\Message\StreamInterface|SplFileInfo|string', $x); +} + +function regexAssert(mixed $x): void +{ + v::regex('x')->assert($x); + assertType('bool|float|int|string', $x); +} + +function resourceTypeAssert(mixed $x): void +{ + v::resourceType()->assert($x); + assertType('resource', $x); +} + +function romanAssert(mixed $x): void +{ + v::roman()->assert($x); + assertType('string', $x); +} + +function scalarValAssert(mixed $x): void +{ + v::scalarVal()->assert($x); + assertType('bool|float|int|string', $x); +} + +function sizeAssert(mixed $x): void +{ + v::size('B', v::intType())->assert($x); + assertType('Psr\Http\Message\StreamInterface|Psr\Http\Message\UploadedFileInterface|SplFileInfo|string', $x); +} + +function slugAssert(mixed $x): void +{ + v::slug()->assert($x); + assertType('string', $x); +} + +function sortedAssert(mixed $x): void +{ + v::sorted('ASC')->assert($x); + assertType('array|string', $x); +} + +function spaceAssert(mixed $x): void +{ + v::space()->assert($x); + assertType('bool|float|int|string', $x); +} + +function spacedAssert(mixed $x): void +{ + v::spaced()->assert($x); + assertType('string', $x); +} + +function startsWithAssert(mixed $x): void +{ + v::startsWith(1)->assert($x); + assertType('array|string', $x); +} + +function stringTypeAssert(mixed $x): void +{ + v::stringType()->assert($x); + assertType('string', $x); +} + +function stringValAssert(mixed $x): void +{ + v::stringVal()->assert($x); + assertType('bool|float|int|string|Stringable', $x); +} + +function subdivisionCodeAssert(mixed $x): void +{ + v::subdivisionCode('US')->assert($x); + assertType('bool|float|int|string|null', $x); +} + +function subsetAssert(mixed $x): void +{ + v::subset([1, 2, 3])->assert($x); + assertType('array', $x); +} + +function symbolicLinkAssert(mixed $x): void +{ + v::symbolicLink()->assert($x); + assertType('SplFileInfo|string', $x); +} + +function timeAssert(mixed $x): void +{ + v::time()->assert($x); + assertType('bool|float|int|string', $x); +} + +function tldAssert(mixed $x): void +{ + v::tld()->assert($x); + assertType('string', $x); +} + +function trimmedAssert(mixed $x): void +{ + v::trimmed()->assert($x); + assertType('string', $x); +} + +function trueValAssert(mixed $x): void +{ + v::trueVal()->assert($x); + assertType('bool|float|int|string', $x); +} + +function undefAssert(mixed $x): void +{ + v::undef()->assert($x); + assertType("''|null", $x); +} + +function uniqueAssert(mixed $x): void +{ + v::unique()->assert($x); + assertType('array', $x); +} + +function uppercaseAssert(mixed $x): void +{ + v::uppercase()->assert($x); + assertType('string', $x); +} + +function urlAssert(mixed $x): void +{ + v::url()->assert($x); + assertType('string', $x); +} + +function uuidAssert(mixed $x): void +{ + v::uuid()->assert($x); + assertType('Ramsey\Uuid\UuidInterface|string', $x); +} + +function versionAssert(mixed $x): void +{ + v::version()->assert($x); + assertType('string', $x); +} + +function vowelAssert(mixed $x): void +{ + v::vowel()->assert($x); + assertType('bool|float|int|string', $x); +} + +function writableAssert(mixed $x): void +{ + v::writable()->assert($x); + assertType('Psr\Http\Message\StreamInterface|SplFileInfo|string', $x); +} + +function xdigitAssert(mixed $x): void +{ + v::xdigit()->assert($x); + assertType('bool|float|int|string', $x); +} + +// ============================================================================ +// Combinations: the first rule (the type) wins; later rules only constrain it +// ============================================================================ + +function chainTypeThenConstraints(mixed $x): void +{ + v::intType()->positive()->between(1, 10)->assert($x); + assertType('int', $x); +} + +function chainTypeThenFormat(mixed $x): void +{ + v::stringType()->email()->assert($x); + assertType('string', $x); +} + +function chainResetRuleMidChain(mixed $x): void +{ + // a non-expressible rule (in()) mid-chain preserves the entry type, not mixed + v::intType()->in([1, 2, 3])->assert($x); + assertType('int', $x); +} + +function chainElementOnType(mixed $x): void +{ + // each() refines the element type even after a container type rule + v::arrayType()->each(v::intType())->assert($x); + assertType('iterable', $x); +} + +// ============================================================================ +// Container subject: the input is narrowed to the container type (key/property/ +// length/max/min), and the prefixed form narrows identically. +// ============================================================================ + +function keyNarrowsToContainer(mixed $x): void +{ + v::key('a', v::intType())->assert($x); + assertType('array|ArrayAccess', $x); +} + +function propertyNarrowsToContainer(mixed $x): void +{ + v::property('id', v::intType())->assert($x); + assertType('object', $x); +} + +function lengthNarrowsToContainer(mixed $x): void +{ + v::length(v::between(1, 5))->assert($x); + assertType('array|Countable|string', $x); +} + +function maxNarrowsToIterable(mixed $x): void +{ + v::max(v::intType())->assert($x); + assertType('iterable', $x); +} + +function keyPrefixNarrowsToContainer(mixed $x): void +{ + v::keyIntType('a')->assert($x); + assertType('array|ArrayAccess', $x); +} + +// ============================================================================ +// Wrap PREFIX composition: the concrete inner type unioned with the bypass set. +// (The nullOr()/undefOr() ARG-forms stay mixed -- see the boundary section.) +// ============================================================================ + +function nullOrPrefixNarrows(mixed $x): void +{ + v::nullOrIntType()->assert($x); + assertType('int|null', $x); +} + +function undefOrPrefixNarrows(mixed $x): void +{ + v::undefOrIntType()->assert($x); + assertType("''|int|null", $x); +} + +function nullOrPrefixDedupesBypass(mixed $x): void +{ + // nullOrNullType(): the inner type already admits null, so the union must not be null|null. + v::nullOrNullType()->assert($x); + assertType('null', $x); +} + +function nullOrPrefixDedupesWithinUnion(mixed $x): void +{ + // nullOrBoolVal(): inner 'scalar|null' + 'null' bypass collapses to scalar|null. + v::nullOrBoolVal()->assert($x); + assertType('bool|float|int|string|null', $x); +} + +function chainTypeThenNullOr(mixed $x): void +{ + // first-wins: a leading type rule survives a later nullOr() (instance preserves TSure, + // and the instance method carries no Chain parameter, so a raw validator is fine too). + v::stringType()->nullOr(v::intType())->assert($x); + assertType('string', $x); +} + +// ============================================================================ +// Boundary: rules whose assurance is not statically expressible stay mixed +// (extension-only); they must not narrow unsoundly. The argument-wrapping forms +// (nullOr/undefOr arg-form, anyOf/oneOf/allOf/named/templated) are here on purpose: +// narrowing them would retype their Validator parameter to Chain and reject raw +// (non-fluent) Validator arguments. +// ============================================================================ + +function notDoesNotNarrow(mixed $x): void +{ + v::not(v::intType())->assert($x); + assertType('mixed', $x); +} + +function inDoesNotNarrow(mixed $x): void +{ + v::in([1, 2, 3])->assert($x); + assertType('mixed', $x); +} + +function whenDoesNotNarrow(mixed $x): void +{ + v::when(v::intType(), v::positive(), v::negative())->assert($x); + assertType('mixed', $x); +} + +function nullOrArgFormDoesNotNarrow(mixed $x): void +{ + v::nullOr(v::intType())->assert($x); + assertType('mixed', $x); +} + +function anyOfDoesNotNarrow(mixed $x): void +{ + v::anyOf(v::intType(), v::stringType())->assert($x); + assertType('mixed', $x); +} + +function allOfDoesNotNarrow(mixed $x): void +{ + v::allOf(v::intType(), v::positive())->assert($x); + assertType('mixed', $x); +} + +function namedDoesNotNarrow(mixed $x): void +{ + v::named('n', v::intType())->assert($x); + assertType('mixed', $x); +} + +// ============================================================================ +// Soundness: isValid() must not narrow the false branch of an inexact rule; +// check() narrows like assert() +// ============================================================================ + +function isValidFalseBranchStaysSound(string $x): void +{ + if (v::email()->isValid($x)) { + return; + } + + assertType('string', $x); +} + +function checkNarrowsLikeAssert(mixed $x): void +{ + v::stringType()->check($x); + assertType('string', $x); +}