-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #64 from programmatordev/YAPV-46-create-language-rule
Create Language rule
- Loading branch information
Showing
11 changed files
with
200 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
# Language | ||
|
||
Validates that a value is a valid language code. | ||
|
||
```php | ||
Language( | ||
string $code = 'alpha-2', | ||
?string $message = null | ||
); | ||
``` | ||
|
||
## Basic Usage | ||
|
||
```php | ||
// default alpha-2 code | ||
Validator::language()->validate('pt'); // true | ||
|
||
// alpha-3 code | ||
Validator::language(code: 'alpha-3')->validate('por'); // true | ||
``` | ||
|
||
> [!NOTE] | ||
> An `UnexpectedValueException` will be thrown when the `code` value is not a valid option. | ||
> [!NOTE] | ||
> An `UnexpectedValueException` will be thrown when the input value is not a `string`. | ||
## Options | ||
|
||
### `code` | ||
|
||
type: `string` default: `alpha-2` | ||
|
||
Set code type to validate the language. | ||
Check the [official language codes](https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes) list for more information. | ||
|
||
Available options: | ||
|
||
- `alpha-2`: two-letter code | ||
- `alpha-3`: three-letter code | ||
|
||
### `message` | ||
|
||
type: `?string` default: `The {{ name }} value is not a valid language, {{ value }} given.` | ||
|
||
Message that will be shown if the input value is not a valid language code. | ||
|
||
The following parameters are available: | ||
|
||
| Parameter | Description | | ||
|---------------|---------------------------| | ||
| `{{ value }}` | The current invalid value | | ||
| `{{ name }}` | Name of the invalid value | | ||
| `{{ code }}` | Selected code type | | ||
|
||
## Changelog | ||
|
||
- `1.1.0` Created |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
<?php | ||
|
||
namespace ProgrammatorDev\Validator\Exception; | ||
|
||
class LanguageException extends ValidationException {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
<?php | ||
|
||
namespace ProgrammatorDev\Validator\Rule; | ||
|
||
use ProgrammatorDev\Validator\Exception\LanguageException; | ||
use ProgrammatorDev\Validator\Exception\UnexpectedOptionException; | ||
use ProgrammatorDev\Validator\Exception\UnexpectedTypeException; | ||
use Symfony\Component\Intl\Languages; | ||
|
||
class Language extends AbstractRule implements RuleInterface | ||
{ | ||
public const ALPHA_2_CODE = 'alpha-2'; | ||
public const ALPHA_3_CODE = 'alpha-3'; | ||
|
||
private const CODE_OPTIONS = [ | ||
self::ALPHA_2_CODE, | ||
self::ALPHA_3_CODE | ||
]; | ||
|
||
private string $message = 'The {{ name }} value is not a valid language, {{ value }} given.'; | ||
|
||
public function __construct( | ||
private readonly string $code = self::ALPHA_2_CODE, | ||
?string $message = null | ||
) | ||
{ | ||
$this->message = $message ?? $this->message; | ||
} | ||
|
||
public function assert(mixed $value, ?string $name = null): void | ||
{ | ||
if (!\in_array($this->code, self::CODE_OPTIONS)) { | ||
throw new UnexpectedOptionException('code', self::CODE_OPTIONS, $this->code); | ||
} | ||
|
||
if (!\is_string($value)) { | ||
throw new UnexpectedTypeException('string', get_debug_type($value)); | ||
} | ||
|
||
// keep original value for parameters | ||
$input = \strtolower($value); | ||
|
||
if ( | ||
($this->code === self::ALPHA_2_CODE && !Languages::exists($input)) | ||
|| ($this->code === self::ALPHA_3_CODE && !Languages::alpha3CodeExists($input)) | ||
) { | ||
throw new LanguageException( | ||
message: $this->message, | ||
parameters: [ | ||
'name' => $name, | ||
'value' => $value, | ||
'code' => $this->code | ||
] | ||
); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
<?php | ||
|
||
namespace ProgrammatorDev\Validator\Test; | ||
|
||
use ProgrammatorDev\Validator\Exception\LanguageException; | ||
use ProgrammatorDev\Validator\Rule\Language; | ||
use ProgrammatorDev\Validator\Test\Util\TestRuleFailureConditionTrait; | ||
use ProgrammatorDev\Validator\Test\Util\TestRuleMessageOptionTrait; | ||
use ProgrammatorDev\Validator\Test\Util\TestRuleSuccessConditionTrait; | ||
use ProgrammatorDev\Validator\Test\Util\TestRuleUnexpectedValueTrait; | ||
|
||
class LanguageTest extends AbstractTest | ||
{ | ||
use TestRuleUnexpectedValueTrait; | ||
use TestRuleFailureConditionTrait; | ||
use TestRuleSuccessConditionTrait; | ||
use TestRuleMessageOptionTrait; | ||
|
||
public static function provideRuleUnexpectedValueData(): \Generator | ||
{ | ||
$unexpectedCodeMessage = '/Invalid code "(.*)"\. Accepted values are\: "(.*)"\./'; | ||
$unexpectedTypeMessage = '/Expected value of type "string", (.*) given\./'; | ||
|
||
yield 'invalid code' => [new Language('invalid'), 'pt', $unexpectedCodeMessage]; | ||
yield 'invalid type' => [new Language(), 123, $unexpectedTypeMessage]; | ||
} | ||
|
||
public static function provideRuleFailureConditionData(): \Generator | ||
{ | ||
$exception = LanguageException::class; | ||
$message = '/The (.*) value is not a valid language, (.*) given\./'; | ||
|
||
yield 'default' => [new Language(), 'prt', $exception, $message]; | ||
yield 'alpha2' => [new Language(code: 'alpha-2'), 'por', $exception, $message]; | ||
yield 'alpha3' => [new Language(code: 'alpha-3'), 'pt', $exception, $message]; | ||
} | ||
|
||
public static function provideRuleSuccessConditionData(): \Generator | ||
{ | ||
yield 'default' => [new Language(), 'pt']; | ||
yield 'alpha2' => [new Language(code: 'alpha-2'), 'pt']; | ||
yield 'alpha3' => [new Language(code: 'alpha-3'), 'por']; | ||
} | ||
|
||
public static function provideRuleMessageOptionData(): \Generator | ||
{ | ||
yield 'message' => [ | ||
new Language( | ||
message: 'The {{ name }} value {{ value }} is not a valid {{ code }} language code.' | ||
), | ||
'invalid', | ||
'The test value "invalid" is not a valid "alpha-2" language code.' | ||
]; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters