aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/league/uri-interfaces/Idna/Option.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/league/uri-interfaces/Idna/Option.php')
-rw-r--r--vendor/league/uri-interfaces/Idna/Option.php179
1 files changed, 179 insertions, 0 deletions
diff --git a/vendor/league/uri-interfaces/Idna/Option.php b/vendor/league/uri-interfaces/Idna/Option.php
new file mode 100644
index 000000000..777979f13
--- /dev/null
+++ b/vendor/league/uri-interfaces/Idna/Option.php
@@ -0,0 +1,179 @@
+<?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 League\Uri\Idna;
+
+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 $value, int $option) => 0 !== ($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) => 0 !== ($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),
+ };
+ }
+}