timrourke/incognito

View on GitHub
src/Entity/Username.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

declare(strict_types=1);

namespace Incognito\Entity;

use Assert\Assertion;

class Username
{
    /**
     * @var string
     */
    private const ALLOWABLE_CHARACTERS_REGEX = "/[\p{L}\p{M}\p{S}\p{N}\p{P}]+/u";

    /**
     * @var string
     */
    private string $username;

    /**
     * Constructor.
     *
     * @param string $username
     * @throws \Assert\AssertionFailedException
     */
    public function __construct(string $username)
    {
        $this->setUsername($username);
    }

    /**
     * @return string
     */
    public function username(): string
    {
        return $this->username;
    }

    /**
     * @return string
     */
    public function __toString(): string
    {
        return $this->username;
    }

    /**
     * Validate and set the username
     *
     * @param  string $username
     * @return void
     * @throws \Assert\AssertionFailedException
     */
    private function setUsername(string $username): void
    {
        Assertion::betweenLength(
            $username,
            1,
            128,
            sprintf(
                "Invalid username \"%s\": username must be between 1 and 128 characters in length.",
                $username
            )
        );

        Assertion::regex(
            $username,
            self::ALLOWABLE_CHARACTERS_REGEX,
            sprintf(
                "Invalid username \"%s\": username contains invalid characters.",
                $username
            )
        );

        $this->username = $username;
    }
}