Вход Регистрация
Файл: vendor/ramsey/uuid/src/Lazy/LazyUuidFromString.php
Строк: 730
<?php

/**
 * This file is part of the ramsey/uuid library
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @copyright Copyright (c) Ben Ramsey <ben@benramsey.com>
 * @license http://opensource.org/licenses/MIT MIT
 */

declare(strict_types=1);

namespace 
RamseyUuidLazy;

use 
DateTimeInterface;
use 
RamseyUuidConverterNumberConverterInterface;
use 
RamseyUuidExceptionUnsupportedOperationException;
use 
RamseyUuidFieldsFieldsInterface;
use 
RamseyUuidRfc4122UuidV1;
use 
RamseyUuidRfc4122UuidV6;
use 
RamseyUuidTypeHexadecimal;
use 
RamseyUuidTypeInteger as IntegerObject;
use 
RamseyUuidUuidFactory;
use 
RamseyUuidUuidInterface;
use 
ValueError;

use function 
assert;
use function 
bin2hex;
use function 
hex2bin;
use function 
sprintf;
use function 
str_replace;
use function 
substr;

/**
 * Lazy version of a UUID: its format has not been determined yet, so it is mostly only usable for string/bytes
 * conversion. This object optimizes instantiation, serialization and string conversion time, at the cost of
 * increased overhead for more advanced UUID operations.
 *
 * @internal this type is used internally for performance reasons, and is not supposed to be directly referenced
 *           in consumer libraries.
 *
 * @psalm-immutable
 *
 * Note: the {@see FieldsInterface} does not declare methods that deprecated API
 *        relies upon: the API has been ported from the {@see RamseyUuidUuid} definition,
 *        and is deprecated anyway.
 * Note: the deprecated API from {@see RamseyUuidUuid} is in use here (on purpose): it will be removed
 *       once the deprecated API is gone from this class too.
 *
 * @psalm-suppress UndefinedInterfaceMethod
 * @psalm-suppress DeprecatedMethod
 */
final class LazyUuidFromString implements UuidInterface
{
    public const 
VALID_REGEX '/A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}z/ms';

    private ?
UuidInterface $unwrapped null;

    
/**
     * @psalm-param non-empty-string $uuid
     */
    
public function __construct(private string $uuid)
    {
    }

    
/** @psalm-pure */
    
public static function fromBytes(string $bytes): self
    
{
        
$base16Uuid bin2hex($bytes);

        return new 
self(
            
substr($base16Uuid08)
            . 
'-'
            
substr($base16Uuid84)
            . 
'-'
            
substr($base16Uuid124)
            . 
'-'
            
substr($base16Uuid164)
            . 
'-'
            
substr($base16Uuid2012)
        );
    }

    public function 
serialize(): string
    
{
        return 
$this->uuid;
    }

    
/**
     * @return array{string: string}
     *
     * @psalm-return array{string: non-empty-string}
     */
    
public function __serialize(): array
    {
        return [
'string' => $this->uuid];
    }

    
/**
     * {@inheritDoc}
     *
     * @param string $data
     *
     * @psalm-param non-empty-string $data
     */
    
public function unserialize(string $data): void
    
{
        
$this->uuid $data;
    }

    
/**
     * @param array{string?: string} $data
     *
     * @psalm-param array{string?: non-empty-string} $data
     * @psalm-suppress UnusedMethodCall
     */
    
public function __unserialize(array $data): void
    
{
        
// @codeCoverageIgnoreStart
        
if (!isset($data['string'])) {
            throw new 
ValueError(sprintf('%s(): Argument #1 ($data) is invalid'__METHOD__));
        }
        
// @codeCoverageIgnoreEnd

        
$this->unserialize($data['string']);
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getNumberConverter(): NumberConverterInterface
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getNumberConverter();
    }

    
/**
     * {@inheritDoc}
     *
     * @psalm-suppress DeprecatedMethod
     */
    
public function getFieldsHex(): array
    {
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getFieldsHex();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getClockSeqHiAndReservedHex(): string
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getClockSeqHiAndReservedHex();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getClockSeqLowHex(): string
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getClockSeqLowHex();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getClockSequenceHex(): string
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getClockSequenceHex();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getDateTime(): DateTimeInterface
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getDateTime();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getLeastSignificantBitsHex(): string
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getLeastSignificantBitsHex();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getMostSignificantBitsHex(): string
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getMostSignificantBitsHex();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getNodeHex(): string
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getNodeHex();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getTimeHiAndVersionHex(): string
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getTimeHiAndVersionHex();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getTimeLowHex(): string
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getTimeLowHex();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getTimeMidHex(): string
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getTimeMidHex();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getTimestampHex(): string
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getTimestampHex();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getUrn(): string
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getUrn();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getVariant(): ?int
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getVariant();
    }

    
/** @psalm-suppress DeprecatedMethod */
    
public function getVersion(): ?int
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getVersion();
    }

    public function 
compareTo(UuidInterface $other): int
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
compareTo($other);
    }

    public function 
equals(?object $other): bool
    
{
        if (! 
$other instanceof UuidInterface) {
            return 
false;
        }

        return 
$this->uuid === $other->toString();
    }

    
/**
     * {@inheritDoc}
     *
     * @psalm-suppress MoreSpecificReturnType
     * @psalm-suppress LessSpecificReturnStatement we know that {@see self::$uuid} is a non-empty string, so
     *                                             we know that {@see hex2bin} will retrieve a non-empty string too.
     */
    
public function getBytes(): string
    
{
        
/** @phpstan-ignore-next-line PHPStan complains that this is not a non-empty-string. */
        
return (string) hex2bin(str_replace('-'''$this->uuid));
    }

    public function 
getFields(): FieldsInterface
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getFields();
    }

    public function 
getHex(): Hexadecimal
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getHex();
    }

    public function 
getInteger(): IntegerObject
    
{
        return (
$this->unwrapped ?? $this->unwrap())
            ->
getInteger();
    }

    public function 
toString(): string
    
{
        return 
$this->uuid;
    }

    public function 
__toString(): string
    
{
        return 
$this->uuid;
    }

    public function 
jsonSerialize(): string
    
{
        return 
$this->uuid;
    }

    
/**
     * @deprecated Use {@see UuidInterface::getFields()} to get a
     *     {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
     *     instance, you may call {@see Rfc4122FieldsInterface::getClockSeqHiAndReserved()}
     *     and use the arbitrary-precision math library of your choice to
     *     convert it to a string integer.
     *
     * @psalm-suppress UndefinedInterfaceMethod
     * @psalm-suppress DeprecatedMethod
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedMethodCall
     */
    
public function getClockSeqHiAndReserved(): string
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());

        return 
$instance->getNumberConverter()
            ->
fromHex(
                
$instance->getFields()
                    ->
getClockSeqHiAndReserved()
                    ->
toString()
            );
    }

    
/**
     * @deprecated Use {@see UuidInterface::getFields()} to get a
     *     {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
     *     instance, you may call {@see Rfc4122FieldsInterface::getClockSeqLow()}
     *     and use the arbitrary-precision math library of your choice to
     *     convert it to a string integer.
     *
     * @psalm-suppress UndefinedInterfaceMethod
     * @psalm-suppress DeprecatedMethod
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedMethodCall
     */
    
public function getClockSeqLow(): string
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());

        return 
$instance->getNumberConverter()
            ->
fromHex(
                
$instance->getFields()
                    ->
getClockSeqLow()
                    ->
toString()
            );
    }

    
/**
     * @deprecated Use {@see UuidInterface::getFields()} to get a
     *     {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
     *     instance, you may call {@see Rfc4122FieldsInterface::getClockSeq()}
     *     and use the arbitrary-precision math library of your choice to
     *     convert it to a string integer.
     *
     * @psalm-suppress UndefinedInterfaceMethod
     * @psalm-suppress DeprecatedMethod
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedMethodCall
     */
    
public function getClockSequence(): string
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());

        return 
$instance->getNumberConverter()
            ->
fromHex(
                
$instance->getFields()
                    ->
getClockSeq()
                    ->
toString()
            );
    }

    
/**
     * @deprecated This method will be removed in 5.0.0. There is no direct
     *     alternative, but the same information may be obtained by splitting
     *     in half the value returned by {@see UuidInterface::getHex()}.
     *
     * @psalm-suppress UndefinedInterfaceMethod
     * @psalm-suppress DeprecatedMethod
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedMethodCall
     */
    
public function getLeastSignificantBits(): string
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());

        return 
$instance->getNumberConverter()
            ->
fromHex(substr($instance->getHex()->toString(), 16));
    }

    
/**
     * @deprecated This method will be removed in 5.0.0. There is no direct
     *     alternative, but the same information may be obtained by splitting
     *     in half the value returned by {@see UuidInterface::getHex()}.
     *
     * @psalm-suppress UndefinedInterfaceMethod
     * @psalm-suppress DeprecatedMethod
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedMethodCall
     */
    
public function getMostSignificantBits(): string
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());

        return 
$instance->getNumberConverter()
            ->
fromHex(substr($instance->getHex()->toString(), 016));
    }

    
/**
     * @deprecated Use {@see UuidInterface::getFields()} to get a
     *     {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
     *     instance, you may call {@see Rfc4122FieldsInterface::getNode()}
     *     and use the arbitrary-precision math library of your choice to
     *     convert it to a string integer.
     *
     * @psalm-suppress UndefinedInterfaceMethod
     * @psalm-suppress DeprecatedMethod
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedMethodCall
     */
    
public function getNode(): string
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());

        return 
$instance->getNumberConverter()
            ->
fromHex(
                
$instance->getFields()
                    ->
getNode()
                    ->
toString()
            );
    }

    
/**
     * @deprecated Use {@see UuidInterface::getFields()} to get a
     *     {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
     *     instance, you may call {@see Rfc4122FieldsInterface::getTimeHiAndVersion()}
     *     and use the arbitrary-precision math library of your choice to
     *     convert it to a string integer.
     *
     * @psalm-suppress UndefinedInterfaceMethod
     * @psalm-suppress DeprecatedMethod
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedMethodCall
     */
    
public function getTimeHiAndVersion(): string
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());

        return 
$instance->getNumberConverter()
            ->
fromHex(
                
$instance->getFields()
                    ->
getTimeHiAndVersion()
                    ->
toString()
            );
    }

    
/**
     * @deprecated Use {@see UuidInterface::getFields()} to get a
     *     {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
     *     instance, you may call {@see Rfc4122FieldsInterface::getTimeLow()}
     *     and use the arbitrary-precision math library of your choice to
     *     convert it to a string integer.
     *
     * @psalm-suppress UndefinedInterfaceMethod
     * @psalm-suppress DeprecatedMethod
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedMethodCall
     */
    
public function getTimeLow(): string
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());

        return 
$instance->getNumberConverter()
            ->
fromHex(
                
$instance->getFields()
                    ->
getTimeLow()
                    ->
toString()
            );
    }

    
/**
     * @deprecated Use {@see UuidInterface::getFields()} to get a
     *     {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
     *     instance, you may call {@see Rfc4122FieldsInterface::getTimeMid()}
     *     and use the arbitrary-precision math library of your choice to
     *     convert it to a string integer.
     *
     * @psalm-suppress UndefinedInterfaceMethod
     * @psalm-suppress DeprecatedMethod
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedMethodCall
     */
    
public function getTimeMid(): string
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());

        return 
$instance->getNumberConverter()
            ->
fromHex(
                
$instance->getFields()
                    ->
getTimeMid()
                    ->
toString()
            );
    }

    
/**
     * @deprecated Use {@see UuidInterface::getFields()} to get a
     *     {@see FieldsInterface} instance. If it is a {@see Rfc4122FieldsInterface}
     *     instance, you may call {@see Rfc4122FieldsInterface::getTimestamp()}
     *     and use the arbitrary-precision math library of your choice to
     *     convert it to a string integer.
     *
     * @psalm-suppress UndefinedInterfaceMethod
     * @psalm-suppress DeprecatedMethod
     * @psalm-suppress MixedArgument
     * @psalm-suppress MixedMethodCall
     */
    
public function getTimestamp(): string
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());
        
$fields $instance->getFields();

        if (
$fields->getVersion() !== 1) {
            throw new 
UnsupportedOperationException('Not a time-based UUID');
        }

        return 
$instance->getNumberConverter()
            ->
fromHex($fields->getTimestamp()->toString());
    }

    public function 
toUuidV1(): UuidV1
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());

        if (
$instance instanceof UuidV1) {
            return 
$instance;
        }

        
assert($instance instanceof UuidV6);

        return 
$instance->toUuidV1();
    }

    public function 
toUuidV6(): UuidV6
    
{
        
$instance = ($this->unwrapped ?? $this->unwrap());

        
assert($instance instanceof UuidV6);

        return 
$instance;
    }

    
/**
     * @psalm-suppress ImpureMethodCall the retrieval of the factory is a clear violation of purity here: this is a
     *                                  known pitfall of the design of this library, where a value object contains
     *                                  a mutable reference to a factory. We use a fixed factory here, so the violation
     *                                  will not have real-world effects, as this object is only instantiated with the
     *                                  default factory settings/features.
     * @psalm-suppress InaccessibleProperty property {@see $unwrapped} is used as a cache: we don't expose it to the
     *                                      outside world, so we should be fine here.
     */
    
private function unwrap(): UuidInterface
    
{
        return 
$this->unwrapped = (new UuidFactory())
            ->
fromString($this->uuid);
    }
}
Онлайн: 0
Реклама