Вход Регистрация
Файл: vendor/league/uri-interfaces/Idna/Option.php
Строк: 188
<?php

/**
 * League.Uri (https://uri.thephpleague.com)
 *
 * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

declare(strict_types=1);

namespace 
LeagueUriIdna;

use 
ReflectionClass;
use 
ReflectionClassConstant;

/**
 * @see https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uidna_8h.html
 */
final class Option
{
    private const DEFAULT                    = 
0;
    private const 
ALLOW_UNASSIGNED           1;
    private const 
USE_STD3_RULES             2;
    private const 
CHECK_BIDI                 4;
    private const 
CHECK_CONTEXTJ             8;
    private const 
NONTRANSITIONAL_TO_ASCII   0x10;
    private const 
NONTRANSITIONAL_TO_UNICODE 0x20;
    private const 
CHECK_CONTEXTO             0x40;

    private function 
__construct(private readonly int $value)
    {
    }

    private static function 
cases(): array
    {
        static 
$assoc;
        if (
null === $assoc) {
            
$assoc = [];
            
$fooClass = new ReflectionClass(self::class);
            foreach (
$fooClass->getConstants(ReflectionClassConstant::IS_PRIVATE) as $name => $value) {
                
$assoc[$name] = $value;
            }
        }

        return 
$assoc;
    }

    public static function new(
int $bytes self::DEFAULT): self
    
{
        return new 
self(array_reduce(
            
self::cases(),
            
fn (int $valueint $option) => !== ($option $bytes) ? ($value $option) : $value,
            
self::DEFAULT
        ));
    }

    public static function 
forIDNA2008Ascii(): self
    
{
        return 
self::new()
            ->
nonTransitionalToAscii()
            ->
checkBidi()
            ->
useSTD3Rules()
            ->
checkContextJ();
    }

    public static function 
forIDNA2008Unicode(): self
    
{
        return 
self::new()
            ->
nonTransitionalToUnicode()
            ->
checkBidi()
            ->
useSTD3Rules()
            ->
checkContextJ();
    }

    public function 
toBytes(): int
    
{
        return 
$this->value;
    }

    
/** array<string, int> */
    
public function list(): array
    {
        return 
array_keys(array_filter(
            
self::cases(),
            
fn (int $value) => !== ($value $this->value)
        ));
    }

    public function 
allowUnassigned(): self
    
{
        return 
$this->add(self::ALLOW_UNASSIGNED);
    }

    public function 
disallowUnassigned(): self
    
{
        return 
$this->remove(self::ALLOW_UNASSIGNED);
    }

    public function 
useSTD3Rules(): self
    
{
        return 
$this->add(self::USE_STD3_RULES);
    }

    public function 
prohibitSTD3Rules(): self
    
{
        return 
$this->remove(self::USE_STD3_RULES);
    }

    public function 
checkBidi(): self
    
{
        return 
$this->add(self::CHECK_BIDI);
    }

    public function 
ignoreBidi(): self
    
{
        return 
$this->remove(self::CHECK_BIDI);
    }

    public function 
checkContextJ(): self
    
{
        return 
$this->add(self::CHECK_CONTEXTJ);
    }

    public function 
ignoreContextJ(): self
    
{
        return 
$this->remove(self::CHECK_CONTEXTJ);
    }

    public function 
checkContextO(): self
    
{
        return 
$this->add(self::CHECK_CONTEXTO);
    }

    public function 
ignoreContextO(): self
    
{
        return 
$this->remove(self::CHECK_CONTEXTO);
    }

    public function 
nonTransitionalToAscii(): self
    
{
        return 
$this->add(self::NONTRANSITIONAL_TO_ASCII);
    }

    public function 
transitionalToAscii(): self
    
{
        return 
$this->remove(self::NONTRANSITIONAL_TO_ASCII);
    }

    public function 
nonTransitionalToUnicode(): self
    
{
        return 
$this->add(self::NONTRANSITIONAL_TO_UNICODE);
    }

    public function 
transitionalToUnicode(): self
    
{
        return 
$this->remove(self::NONTRANSITIONAL_TO_UNICODE);
    }

    public function 
add(Option|int|null $option null): self
    
{
        return 
match (true) {
            
null === $option => $this,
            
$option instanceof self => self::new($this->value $option->value),
            default => 
self::new($this->value $option),
        };
    }

    public function 
remove(Option|int|null $option null): self
    
{
        return 
match (true) {
            
null === $option => $this,
            
$option instanceof self => self::new($this->value & ~$option->value),
            default => 
self::new($this->value & ~$option),
        };
    }
}
Онлайн: 2
Реклама