Jacek Kowalski
4 hours ago 6b9278a5d57091fce636dbb640b380cfb990db6c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
 
declare(strict_types=1);
 
namespace App\Enum;
 
use App\Model\Isbn;
 
enum LabelType: string {
    case TEXT = 'text';
    case ISBN = 'isbn';
    case ISSN = 'issn';
 
    /**
     * Brings a value to its stored form; an ISBN-10 becomes an ISBN-13. A value that cannot be
     * normalized is returned as it is, and isValid() then rejects it.
     */
    public function normalize(string $value): string {
        $compact = strtoupper(str_replace(['-', ' '], '', $value));
 
        return match ($this) {
            self::TEXT => trim($value),
            self::ISBN => Isbn::toIsbn13($compact) ?? $compact,
            self::ISSN => $compact,
        };
    }
 
    public function isValid(string $normalizedValue): bool {
        return match ($this) {
            self::TEXT => $normalizedValue !== '',
            self::ISBN => $normalizedValue === Isbn::toIsbn13($normalizedValue) && \strlen($normalizedValue) === 13,
            self::ISSN => preg_match('/^(\d{7}[\dX]|\d{13})$/', $normalizedValue) === 1,
        };
    }
}