Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
95.00% covered (success)
95.00%
19 / 20
75.00% covered (warning)
75.00%
3 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
InternationalPhoneNumber
95.00% covered (success)
95.00%
19 / 20
75.00% covered (warning)
75.00%
3 / 4
6
0.00% covered (danger)
0.00%
0 / 1
 validate
66.67% covered (warning)
66.67%
2 / 3
0.00% covered (danger)
0.00%
0 / 1
2.15
 convert
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 toPhoneNumber
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 createRandom
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2namespace Apie\CountryAndPhoneNumber;
3
4use Apie\Core\Attributes\Description;
5use Apie\Core\Attributes\FakeMethod;
6use Apie\Core\ValueObjects\Exceptions\InvalidStringForValueObjectException;
7use Apie\Core\ValueObjects\Interfaces\StringValueObjectInterface;
8use Apie\Core\ValueObjects\IsStringValueObject;
9use Apie\CountryAndPhoneNumber\Factories\PhoneNumberFactory;
10use Faker\Generator;
11use libphonenumber\PhoneNumberFormat;
12use libphonenumber\PhoneNumberUtil;
13use PrinsFrank\Standards\Country\CountryAlpha2;
14use ReflectionClass;
15
16#[FakeMethod('createRandom')]
17#[Description('International phone number in E164 format, or example +31611223344.')]
18final class InternationalPhoneNumber implements StringValueObjectInterface
19{
20    use IsStringValueObject;
21
22    public static function validate(string $input): void
23    {
24        $phoneUtil = PhoneNumberUtil::getInstance();
25        if (!$phoneUtil->isPossibleNumber($input)) {
26            throw new InvalidStringForValueObjectException($input, new ReflectionClass(__CLASS__));
27        }
28    }
29
30    protected function convert(string $input): string
31    {
32        $phoneUtil = PhoneNumberUtil::getInstance();
33        $phone = $phoneUtil->parse($input);
34        return $phoneUtil->format($phone, PhoneNumberFormat::E164);
35    }
36
37    public function toPhoneNumber(): PhoneNumber
38    {
39        $phoneUtil = PhoneNumberUtil::getInstance();
40        $phone = $phoneUtil->parse($this->internal);
41        return PhoneNumberFactory::createFrom(
42            $this->internal,
43            CountryAlpha2::from($phoneUtil->getRegionCodeForNumber($phone))
44        );
45    }
46
47    public static function createRandom(Generator $generator): self
48    {
49        $phoneNumber = '';
50        do {
51            $country = $generator->randomElement(CountryAlpha2::cases());
52            $phoneNumberUtil = PhoneNumberUtil::getInstance();
53            $phoneNumberObject = $phoneNumberUtil->getExampleNumber($country->value);
54            if ($phoneNumberObject) {
55                $phoneNumber = $phoneNumberUtil->format($phoneNumberObject, PhoneNumberFormat::E164);
56            }
57        } while ($phoneNumber === '');
58        return new InternationalPhoneNumber($phoneNumber);
59    }
60}