From 99d45212a8f8263c2464dac117af2a5ddfb76ec3 Mon Sep 17 00:00:00 2001 From: Martin Strouhal Date: Sun, 17 Sep 2023 15:16:30 +0200 Subject: [PATCH 1/2] JsonSerializable Interface implemented for all relevant types --- src/Address.php | 11 +++--- src/Base64String.php | 5 +-- src/CompanyRegistrationNumber.php | 5 +-- src/ContentType.php | 9 ++--- src/CountryCode.php | 2 +- src/CurrencyCode.php | 3 +- src/DateTimeRange.php | 9 ++--- src/Domain.php | 5 +-- src/Duration.php | 9 ++--- src/Enum.php | 10 ++---- src/GetValueJsonSerializableTrait.php | 15 ++++++++ src/Hex32.php | 10 +++--- src/HostName.php | 7 ++-- src/HttpMethod.php | 1 - src/Iban.php | 6 ++-- src/IpAddress.php | 36 +++++++++++--------- src/JsonString.php | 4 +-- src/KeyValuePair.php | 7 ++-- src/LoginCredentials.php | 7 ++-- src/NonEmptyString.php | 4 +-- src/Part.php | 4 +-- src/PhoneNumber.php | 4 +-- src/Port.php | 4 +-- src/Price.php | 9 ++--- src/Quantity.php | 4 +-- src/ReLUValue.php | 4 +-- src/ScalarLeavesArray.php | 5 +-- src/SigmoidValue.php | 4 +-- src/SwiftBic.php | 4 +-- src/TimeUnit.php | 2 +- src/ToArrayJsonSerializableTrait.php | 18 ++++++++++ src/ToStringInterface.php | 2 +- src/ToStringTrait.php | 2 ++ src/UniqueIntArray.php | 3 +- src/UniqueStringArray.php | 3 +- src/UnsignedFloat.php | 4 +-- src/UnsignedInt.php | 4 +-- src/UrlType.php | 2 +- src/VatId.php | 8 ++--- src/ZipCode.php | 4 +-- tests/GetValueJsonSerializableTraitTest.phpt | 23 +++++++++++++ tests/ToArrayJsonSerializableTraitTest.phpt | 31 +++++++++++++++++ tests/UrlTypeTest.phpt | 14 ++++++++ 43 files changed, 223 insertions(+), 104 deletions(-) create mode 100644 src/GetValueJsonSerializableTrait.php create mode 100644 src/ToArrayJsonSerializableTrait.php create mode 100644 tests/GetValueJsonSerializableTraitTest.phpt create mode 100644 tests/ToArrayJsonSerializableTraitTest.phpt diff --git a/src/Address.php b/src/Address.php index 9e47f68..1d35c49 100644 --- a/src/Address.php +++ b/src/Address.php @@ -8,19 +8,20 @@ use SmartEmailing\Types\Comparable\ComparableInterface; use SmartEmailing\Types\ExtractableTraits\ArrayExtractableTrait; -final class Address implements ToArrayInterface, ComparableInterface +final class Address implements ToArrayInterface, ComparableInterface, \JsonSerializable { use ArrayExtractableTrait; use ArrayComparableTrait; + use ToArrayJsonSerializableTrait; - private string $streetAndNumber; + private readonly string $streetAndNumber; - private string $town; + private readonly string $town; - private ZipCode $zipCode; + private readonly ZipCode $zipCode; - private CountryCode $country; + private readonly CountryCode $country; /** * @param array $data diff --git a/src/Base64String.php b/src/Base64String.php index 6224d50..cd2f44f 100644 --- a/src/Base64String.php +++ b/src/Base64String.php @@ -8,15 +8,16 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; -final class Base64String implements ToStringInterface, ComparableInterface +final class Base64String implements ToStringInterface, ComparableInterface, \JsonSerializable { use StringExtractableTrait; use ToStringTrait; use StringComparableTrait; + use GetValueJsonSerializableTrait; private function __construct( - private string $value + private readonly string $value ) { if (!$this->isValid($value)) { diff --git a/src/CompanyRegistrationNumber.php b/src/CompanyRegistrationNumber.php index d988413..9a88fb7 100644 --- a/src/CompanyRegistrationNumber.php +++ b/src/CompanyRegistrationNumber.php @@ -9,14 +9,15 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; -final class CompanyRegistrationNumber implements ToStringInterface, ComparableInterface +final class CompanyRegistrationNumber implements ToStringInterface, ComparableInterface, \JsonSerializable { use StringExtractableTrait; use ToStringTrait; use StringComparableTrait; + use GetValueJsonSerializableTrait; - private string $value; + private readonly string $value; private function __construct( string $value diff --git a/src/ContentType.php b/src/ContentType.php index 3807340..5bc0b6d 100644 --- a/src/ContentType.php +++ b/src/ContentType.php @@ -9,18 +9,19 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; -final class ContentType implements ToStringInterface, ComparableInterface +final class ContentType implements ToStringInterface, ComparableInterface, \JsonSerializable { use StringExtractableTrait; use ToStringTrait; use StringComparableTrait; + use GetValueJsonSerializableTrait; - private string $value; + private readonly string $value; - private string $type; + private readonly string $type; - private string $subType; + private readonly string $subType; private function __construct( string $value diff --git a/src/CountryCode.php b/src/CountryCode.php index df4c9dd..12db487 100644 --- a/src/CountryCode.php +++ b/src/CountryCode.php @@ -11,7 +11,7 @@ * * @see https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 */ -final class CountryCode extends Enum implements ToStringInterface +final class CountryCode extends Enum implements ToStringInterface, \JsonSerializable { use EnumExtractableTrait; diff --git a/src/CurrencyCode.php b/src/CurrencyCode.php index 77170f2..0268a70 100644 --- a/src/CurrencyCode.php +++ b/src/CurrencyCode.php @@ -9,11 +9,12 @@ /** * ISO-4217 three-letter ("Alpha-3") */ -final class CurrencyCode extends Enum implements ToStringInterface +final class CurrencyCode extends Enum implements ToStringInterface, \JsonSerializable { use EnumExtractableTrait; use ToStringTrait; + use GetValueJsonSerializableTrait; public const CZK = 'CZK'; diff --git a/src/DateTimeRange.php b/src/DateTimeRange.php index 19d9881..6e2d71d 100644 --- a/src/DateTimeRange.php +++ b/src/DateTimeRange.php @@ -8,17 +8,18 @@ use SmartEmailing\Types\Comparable\ComparableInterface; use SmartEmailing\Types\ExtractableTraits\ArrayExtractableTrait; -final class DateTimeRange implements ToArrayInterface, ComparableInterface +final class DateTimeRange implements ToArrayInterface, ComparableInterface, \JsonSerializable { use ArrayExtractableTrait; use ArrayComparableTrait; + use ToArrayJsonSerializableTrait; - private \DateTimeImmutable $from; + private readonly \DateTimeImmutable $from; - private \DateTimeImmutable $to; + private readonly \DateTimeImmutable $to; - private int $durationInSeconds; + private readonly int $durationInSeconds; /** * @param array $data diff --git a/src/Domain.php b/src/Domain.php index 048e088..79222e4 100644 --- a/src/Domain.php +++ b/src/Domain.php @@ -19,7 +19,7 @@ final class Domain implements ToStringInterface use StringExtractableTrait; use ToStringTrait; - private string $value; + private readonly string $value; private function __construct( string $value @@ -56,7 +56,8 @@ public function getSecondLevelDomain(): Domain private function isValid( string $value - ): bool { + ): bool + { return \preg_match('/^([a-z\\d](-*[a-z\\d])*)(\\.([a-z\\d](-*[a-z\\d])*))*$/i', $value) //valid chars check && \preg_match('/^.{1,253}$/', $value)// overall length check && \preg_match('/^[^\\.]{1,63}(\\.[^\\.]{1,63})*$/', $value); diff --git a/src/Duration.php b/src/Duration.php index 03f5dfa..9905f7c 100644 --- a/src/Duration.php +++ b/src/Duration.php @@ -9,17 +9,18 @@ use SmartEmailing\Types\Comparable\ComparableInterface; use SmartEmailing\Types\ExtractableTraits\ExtractableTrait; -final class Duration implements ToStringInterface, ToArrayInterface, ComparableInterface +final class Duration implements ToStringInterface, ToArrayInterface, ComparableInterface, \JsonSerializable { use ExtractableTrait; use ArrayComparableTrait; + use ToArrayJsonSerializableTrait; - private int $value; + private readonly int $value; - private TimeUnit $unit; + private readonly TimeUnit $unit; - private int $lengthInSeconds; + private readonly int $lengthInSeconds; /** * @param array $data diff --git a/src/Enum.php b/src/Enum.php index 79acdab..1f1e144 100644 --- a/src/Enum.php +++ b/src/Enum.php @@ -8,13 +8,10 @@ use ReflectionClass; use ReflectionClassConstant; -abstract class Enum +abstract class Enum implements \JsonSerializable, ToStringInterface { - /** - * @var mixed - */ - private $value; + use ToStringTrait; /** * @var array indexed by enum and value @@ -27,11 +24,10 @@ abstract class Enum private static array $availableValues = []; final private function __construct( - mixed $value + private mixed $value ) { static::checkValue($value); - $this->value = $value; } /** diff --git a/src/GetValueJsonSerializableTrait.php b/src/GetValueJsonSerializableTrait.php new file mode 100644 index 0000000..ee89264 --- /dev/null +++ b/src/GetValueJsonSerializableTrait.php @@ -0,0 +1,15 @@ +getValue(); + } + +} diff --git a/src/Hex32.php b/src/Hex32.php index 97ad545..1fae782 100644 --- a/src/Hex32.php +++ b/src/Hex32.php @@ -9,18 +9,19 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; -final class Hex32 implements ToStringInterface, ComparableInterface +final class Hex32 implements ToStringInterface, ComparableInterface, \JsonSerializable { use StringExtractableTrait; use ToStringTrait; use StringComparableTrait; - private string $value; + private readonly string $value; private function __construct( string $value - ) { + ) + { if (!$this->isValid($value)) { throw new InvalidTypeException('Invalid hex string: ' . $value); } @@ -30,7 +31,8 @@ private function __construct( public static function fromGuid( Guid $guid - ): Hex32 { + ): Hex32 + { return self::from( Strings::replace($guid->getValue(), '/-/', '') ); diff --git a/src/HostName.php b/src/HostName.php index 9b6c90b..fe92688 100644 --- a/src/HostName.php +++ b/src/HostName.php @@ -9,14 +9,14 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; -final class HostName implements ToStringInterface, ComparableInterface +final class HostName implements ToStringInterface, ComparableInterface, \JsonSerializable { use StringExtractableTrait; use ToStringTrait; use StringComparableTrait; - private string $value; + private readonly string $value; private function __construct( string $value @@ -53,7 +53,8 @@ public function getSecondLevelDomain(): HostName private function isValid( string $value - ): bool { + ): bool + { return \preg_match('/^([a-z\\d](-*[a-z\\d])*)(\\.([a-z\\d](-*[a-z\\d])*))*$/i', $value) //valid chars check && \preg_match('/^.{1,253}$/', $value)// overall length check && \preg_match('/^[^\\.]{1,63}(\\.[^\\.]{1,63})*$/', $value); diff --git a/src/HttpMethod.php b/src/HttpMethod.php index 4802787..06bd5b5 100644 --- a/src/HttpMethod.php +++ b/src/HttpMethod.php @@ -12,7 +12,6 @@ final class HttpMethod extends Enum implements ToStringInterface, ComparableInte { use EnumExtractableTrait; - use ToStringTrait; use StringComparableTrait; public const GET = 'GET'; diff --git a/src/Iban.php b/src/Iban.php index 240d75a..ec3afd0 100644 --- a/src/Iban.php +++ b/src/Iban.php @@ -8,7 +8,7 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; -final class Iban implements ToStringInterface, ComparableInterface +final class Iban implements ToStringInterface, ComparableInterface, \JsonSerializable { use StringExtractableTrait; @@ -18,10 +18,10 @@ final class Iban implements ToStringInterface, ComparableInterface public const FORMAT_ELECTRONIC = 'electronic'; public const FORMAT_PRINT = 'print'; - private \Iban\Validation\Iban $iban; + private readonly \Iban\Validation\Iban $iban; public function __construct( - private string $value + private readonly string $value ) { if (!\class_exists(\Iban\Validation\Iban::class) || !\class_exists(\Iban\Validation\Validator::class)) { diff --git a/src/IpAddress.php b/src/IpAddress.php index caa4641..7b186f4 100644 --- a/src/IpAddress.php +++ b/src/IpAddress.php @@ -9,21 +9,25 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; -final class IpAddress implements ToStringInterface, ComparableInterface +final class IpAddress implements ToStringInterface, ComparableInterface, \JsonSerializable { use StringExtractableTrait; use ToStringTrait; use StringComparableTrait; - private string $value; + private readonly string $value; - private int $version; + private readonly int $version; private function __construct( string $value - ) { - $this->initialize($value); + ) + { + [ + $this->value, + $this->version, + ] = $this->initialize($value); } public function getValue(): string @@ -38,7 +42,8 @@ public function getVersion(): int private function isValidIpV4( string $value - ): bool { + ): bool + { return (bool) \preg_match( '~^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$~', $value @@ -47,16 +52,21 @@ private function isValidIpV4( private function isValidIpV6( string $value - ): bool { + ): bool + { return (bool) \preg_match( '~^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})\z~i', $value ); } + /** + * @return array{string, int} + */ private function initialize( string $value - ): bool { + ): array + { $value = Strings::trim($value); $value = Strings::lower($value); $value = \strtr( @@ -68,17 +78,11 @@ private function initialize( ); if ($this->isValidIpV4($value)) { - $this->value = $value; - $this->version = 4; - - return true; + return [$value, 4]; } if ($this->isValidIpV6($value)) { - $this->value = $value; - $this->version = 6; - - return true; + return [$value, 6]; } throw new InvalidTypeException('Invalid IP address: ' . $value); diff --git a/src/JsonString.php b/src/JsonString.php index ce38261..b439df4 100644 --- a/src/JsonString.php +++ b/src/JsonString.php @@ -10,7 +10,7 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\ExtractableTrait; -final class JsonString implements ToStringInterface, ComparableInterface +final class JsonString implements ToStringInterface, ComparableInterface, \JsonSerializable { use ExtractableTrait; @@ -18,7 +18,7 @@ final class JsonString implements ToStringInterface, ComparableInterface use StringComparableTrait; private function __construct( - private string $value + private readonly string $value ) { if (!$this->isValid($value)) { diff --git a/src/KeyValuePair.php b/src/KeyValuePair.php index 4f8cf78..fa21f63 100644 --- a/src/KeyValuePair.php +++ b/src/KeyValuePair.php @@ -8,15 +8,16 @@ use SmartEmailing\Types\Comparable\ComparableInterface; use SmartEmailing\Types\ExtractableTraits\ArrayExtractableTrait; -final class KeyValuePair implements ToArrayInterface, ComparableInterface +final class KeyValuePair implements ToArrayInterface, ComparableInterface, \JsonSerializable { use ArrayExtractableTrait; use ArrayComparableTrait; + use ToArrayJsonSerializableTrait; - private string $key; + private readonly string $key; - private string $value; + private readonly string $value; /** * @param array $data diff --git a/src/LoginCredentials.php b/src/LoginCredentials.php index ac96e73..13ea058 100644 --- a/src/LoginCredentials.php +++ b/src/LoginCredentials.php @@ -8,15 +8,16 @@ use SmartEmailing\Types\Comparable\ComparableInterface; use SmartEmailing\Types\ExtractableTraits\ArrayExtractableTrait; -final class LoginCredentials implements ToArrayInterface, ComparableInterface +final class LoginCredentials implements ToArrayInterface, ComparableInterface, \JsonSerializable { use ArrayExtractableTrait; use ArrayComparableTrait; + use ToArrayJsonSerializableTrait; - private string $login; + private readonly string $login; - private string $password; + private readonly string $password; /** * @param array $data diff --git a/src/NonEmptyString.php b/src/NonEmptyString.php index e771fdc..ef548f6 100644 --- a/src/NonEmptyString.php +++ b/src/NonEmptyString.php @@ -9,14 +9,14 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; -final class NonEmptyString implements ToStringInterface, ComparableInterface +final class NonEmptyString implements ToStringInterface, ComparableInterface, \JsonSerializable { use StringExtractableTrait; use ToStringTrait; use StringComparableTrait; - private string $value; + private readonly string $value; public function __construct( string $value diff --git a/src/Part.php b/src/Part.php index 3013583..19932f0 100644 --- a/src/Part.php +++ b/src/Part.php @@ -8,7 +8,7 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\FloatExtractableTrait; -final class Part implements ToStringInterface, ComparableInterface +final class Part implements ToStringInterface, ComparableInterface, \JsonSerializable { use FloatExtractableTrait; @@ -16,7 +16,7 @@ final class Part implements ToStringInterface, ComparableInterface use StringComparableTrait; public function __construct( - private float $value + private readonly float $value ) { if ($value < 0 || $value > 1) { throw new InvalidTypeException('Invalid part: ' . $value); diff --git a/src/PhoneNumber.php b/src/PhoneNumber.php index c4712e4..64a198e 100644 --- a/src/PhoneNumber.php +++ b/src/PhoneNumber.php @@ -10,14 +10,14 @@ use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; use SmartEmailing\Types\Helpers\CountryCodeToPhoneCodeTable; -final class PhoneNumber implements ToStringInterface, ComparableInterface +final class PhoneNumber implements ToStringInterface, ComparableInterface, \JsonSerializable { use StringExtractableTrait; use ToStringTrait; use StringComparableTrait; - private string $value; + private readonly string $value; private function __construct( string $value diff --git a/src/Port.php b/src/Port.php index 3ffc806..85354ba 100644 --- a/src/Port.php +++ b/src/Port.php @@ -8,7 +8,7 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\IntExtractableTrait; -final class Port implements ToStringInterface, ComparableInterface +final class Port implements ToStringInterface, ComparableInterface, \JsonSerializable { use IntExtractableTrait; @@ -16,7 +16,7 @@ final class Port implements ToStringInterface, ComparableInterface use StringComparableTrait; public function __construct( - private int $value + private readonly int $value ) { if ($value < 0 || $value > 65535) { throw new InvalidTypeException('Invalid Port number: ' . $value); diff --git a/src/Price.php b/src/Price.php index fab8e1a..7bbd521 100644 --- a/src/Price.php +++ b/src/Price.php @@ -8,17 +8,18 @@ use SmartEmailing\Types\Comparable\ComparableInterface; use SmartEmailing\Types\ExtractableTraits\ArrayExtractableTrait; -final class Price implements ToArrayInterface, ComparableInterface +final class Price implements ToArrayInterface, ComparableInterface, \JsonSerializable { use ArrayExtractableTrait; use ArrayComparableTrait; + use ToArrayJsonSerializableTrait; - private float $withoutVat; + private readonly float $withoutVat; - private float $withVat; + private readonly float $withVat; - private CurrencyCode $currency; + private readonly CurrencyCode $currency; /** * @param array $data diff --git a/src/Quantity.php b/src/Quantity.php index 80cadcc..8df4e92 100644 --- a/src/Quantity.php +++ b/src/Quantity.php @@ -8,7 +8,7 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\IntExtractableTrait; -final class Quantity implements ToStringInterface, ComparableInterface +final class Quantity implements ToStringInterface, ComparableInterface, \JsonSerializable { use IntExtractableTrait; @@ -16,7 +16,7 @@ final class Quantity implements ToStringInterface, ComparableInterface use StringComparableTrait; public function __construct( - private int $value + private readonly int $value ) { if ($value < 1 || $value > \PHP_INT_MAX) { throw new InvalidTypeException('Invalid quantity: ' . $value); diff --git a/src/ReLUValue.php b/src/ReLUValue.php index 355c9c3..c27dedc 100644 --- a/src/ReLUValue.php +++ b/src/ReLUValue.php @@ -8,7 +8,7 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\FloatExtractableTrait; -final class ReLUValue implements ToStringInterface, ComparableInterface +final class ReLUValue implements ToStringInterface, ComparableInterface, \JsonSerializable { use FloatExtractableTrait; @@ -16,7 +16,7 @@ final class ReLUValue implements ToStringInterface, ComparableInterface use StringComparableTrait; public function __construct( - private float $value + private readonly float $value ) { if ($value < 0.0) { throw new InvalidTypeException('Invalid ReLU value: ' . $value); diff --git a/src/ScalarLeavesArray.php b/src/ScalarLeavesArray.php index 99305e7..a880bdc 100644 --- a/src/ScalarLeavesArray.php +++ b/src/ScalarLeavesArray.php @@ -9,17 +9,18 @@ use SmartEmailing\Types\ExtractableTraits\ArrayExtractableTrait; use SmartEmailing\Types\Helpers\ValidationHelpers; -final class ScalarLeavesArray implements ToArrayInterface, ComparableInterface +final class ScalarLeavesArray implements ToArrayInterface, ComparableInterface, \JsonSerializable { use ArrayExtractableTrait; use ArrayComparableTrait; + use ToArrayJsonSerializableTrait; /** * @param array $data */ public function __construct( - private array $data + private readonly array $data ) { if (!ValidationHelpers::isScalarLeavesArray($data)) { throw new InvalidTypeException('Array must have all it\'s leaves scalar or null'); diff --git a/src/SigmoidValue.php b/src/SigmoidValue.php index 2a86b2a..81832d0 100644 --- a/src/SigmoidValue.php +++ b/src/SigmoidValue.php @@ -8,7 +8,7 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\FloatExtractableTrait; -final class SigmoidValue implements ToStringInterface, ComparableInterface +final class SigmoidValue implements ToStringInterface, ComparableInterface, \JsonSerializable { use FloatExtractableTrait; @@ -16,7 +16,7 @@ final class SigmoidValue implements ToStringInterface, ComparableInterface use StringComparableTrait; public function __construct( - private float $value + private readonly float $value ) { if ($value < -1 || $value > 1) { throw new InvalidTypeException('Invalid sigmoid value: ' . $value); diff --git a/src/SwiftBic.php b/src/SwiftBic.php index 0857935..e507eb3 100644 --- a/src/SwiftBic.php +++ b/src/SwiftBic.php @@ -9,7 +9,7 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; -final class SwiftBic implements ToStringInterface, ComparableInterface +final class SwiftBic implements ToStringInterface, ComparableInterface, \JsonSerializable { use ToStringTrait; @@ -17,7 +17,7 @@ final class SwiftBic implements ToStringInterface, ComparableInterface use StringComparableTrait; public function __construct( - private string $value + private readonly string $value ) { if (!$this->isValid($this->value)) { diff --git a/src/TimeUnit.php b/src/TimeUnit.php index f1e732f..fc2b624 100644 --- a/src/TimeUnit.php +++ b/src/TimeUnit.php @@ -6,7 +6,7 @@ use SmartEmailing\Types\ExtractableTraits\EnumExtractableTrait; -final class TimeUnit extends Enum implements ToStringInterface +final class TimeUnit extends Enum implements ToStringInterface, \JsonSerializable { use EnumExtractableTrait; diff --git a/src/ToArrayJsonSerializableTrait.php b/src/ToArrayJsonSerializableTrait.php new file mode 100644 index 0000000..31a4d18 --- /dev/null +++ b/src/ToArrayJsonSerializableTrait.php @@ -0,0 +1,18 @@ + + */ + public function jsonSerialize(): array + { + return $this->toArray(); + } + +} diff --git a/src/ToStringInterface.php b/src/ToStringInterface.php index 673c25b..4790408 100644 --- a/src/ToStringInterface.php +++ b/src/ToStringInterface.php @@ -4,7 +4,7 @@ namespace SmartEmailing\Types; -interface ToStringInterface +interface ToStringInterface extends \Stringable { public function __toString(): string; diff --git a/src/ToStringTrait.php b/src/ToStringTrait.php index 069f903..84b44d0 100644 --- a/src/ToStringTrait.php +++ b/src/ToStringTrait.php @@ -7,6 +7,8 @@ trait ToStringTrait { + use GetValueJsonSerializableTrait; + public function __toString(): string { return (string) $this->getValue(); diff --git a/src/UniqueIntArray.php b/src/UniqueIntArray.php index 217de85..fcf7084 100644 --- a/src/UniqueIntArray.php +++ b/src/UniqueIntArray.php @@ -11,12 +11,13 @@ /** * @implements \IteratorAggregate */ -final class UniqueIntArray implements \Countable, \IteratorAggregate, ToArrayInterface, ComparableInterface +final class UniqueIntArray implements \Countable, \IteratorAggregate, ToArrayInterface, ComparableInterface, \JsonSerializable { use ArrayExtractableTrait; use UniqueArrayFeatures; use ArrayComparableTrait; + use ToArrayJsonSerializableTrait; /** * @var array diff --git a/src/UniqueStringArray.php b/src/UniqueStringArray.php index 5b328a3..9ff1103 100644 --- a/src/UniqueStringArray.php +++ b/src/UniqueStringArray.php @@ -11,12 +11,13 @@ /** * @implements \IteratorAggregate */ -final class UniqueStringArray implements \Countable, \IteratorAggregate, ToArrayInterface, ComparableInterface +final class UniqueStringArray implements \Countable, \IteratorAggregate, ToArrayInterface, ComparableInterface, \JsonSerializable { use ArrayExtractableTrait; use UniqueArrayFeatures; use ArrayComparableTrait; + use ToArrayJsonSerializableTrait; /** * @var array diff --git a/src/UnsignedFloat.php b/src/UnsignedFloat.php index 23e21d5..7d0eecb 100644 --- a/src/UnsignedFloat.php +++ b/src/UnsignedFloat.php @@ -8,7 +8,7 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\FloatExtractableTrait; -final class UnsignedFloat implements ToStringInterface, ComparableInterface +final class UnsignedFloat implements ToStringInterface, ComparableInterface, \JsonSerializable { use FloatExtractableTrait; @@ -16,7 +16,7 @@ final class UnsignedFloat implements ToStringInterface, ComparableInterface use StringComparableTrait; public function __construct( - private float $value + private readonly float $value ) { if ($value < 0.0 || $value > \PHP_INT_MAX) { throw new InvalidTypeException('Invalid unsigned float: ' . $value); diff --git a/src/UnsignedInt.php b/src/UnsignedInt.php index 321c665..487ad70 100644 --- a/src/UnsignedInt.php +++ b/src/UnsignedInt.php @@ -8,7 +8,7 @@ use SmartEmailing\Types\Comparable\StringComparableTrait; use SmartEmailing\Types\ExtractableTraits\IntExtractableTrait; -final class UnsignedInt implements ToStringInterface, ComparableInterface +final class UnsignedInt implements ToStringInterface, ComparableInterface, \JsonSerializable { use IntExtractableTrait; @@ -16,7 +16,7 @@ final class UnsignedInt implements ToStringInterface, ComparableInterface use StringComparableTrait; public function __construct( - private int $value + private readonly int $value ) { if ($value < 0 || $value > \PHP_INT_MAX) { throw new InvalidTypeException('Invalid unsigned integer: ' . $value); diff --git a/src/UrlType.php b/src/UrlType.php index 1fb183d..3fa4961 100644 --- a/src/UrlType.php +++ b/src/UrlType.php @@ -12,7 +12,7 @@ use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; use SmartEmailing\Types\Helpers\StringHelpers; -final class UrlType implements ToStringInterface, ComparableInterface +final class UrlType implements ToStringInterface, ComparableInterface, \JsonSerializable { use StringExtractableTrait; diff --git a/src/VatId.php b/src/VatId.php index 0a122dc..570905c 100644 --- a/src/VatId.php +++ b/src/VatId.php @@ -11,18 +11,18 @@ use SmartEmailing\Types\ExtractableTraits\StringExtractableTrait; use SmartEmailing\Types\Helpers\StringHelpers; -final class VatId implements ToStringInterface, ComparableInterface +final class VatId implements ToStringInterface, ComparableInterface, \JsonSerializable { use ToStringTrait; use StringExtractableTrait; use StringComparableTrait; - private ?CountryCode $country; + private readonly ?CountryCode $country; - private ?string $prefix; + private readonly ?string $prefix; - private string $vatNumber; + private readonly string $vatNumber; /** * @var array diff --git a/src/ZipCode.php b/src/ZipCode.php index 5d24aea..916c170 100644 --- a/src/ZipCode.php +++ b/src/ZipCode.php @@ -11,14 +11,14 @@ use SmartEmailing\Types\Helpers\StringHelpers; // phpcs:disable SlevomatCodingStandard.Files.LineLength.LineTooLong -final class ZipCode implements ToStringInterface, ComparableInterface +final class ZipCode implements ToStringInterface, ComparableInterface, \JsonSerializable { use StringExtractableTrait; use ToStringTrait; use StringComparableTrait; - private string $value; + private readonly string $value; /** * @var array diff --git a/tests/GetValueJsonSerializableTraitTest.phpt b/tests/GetValueJsonSerializableTraitTest.phpt new file mode 100644 index 0000000..2a7aa73 --- /dev/null +++ b/tests/GetValueJsonSerializableTraitTest.phpt @@ -0,0 +1,23 @@ +getValue(), + \json_decode((string) \json_encode($stringExtractable)) +); + +$intExtractable = Port::from(80); + +Assert::equal( + $intExtractable->getValue(), + \json_decode((string) \json_encode($intExtractable)) +); diff --git a/tests/ToArrayJsonSerializableTraitTest.phpt b/tests/ToArrayJsonSerializableTraitTest.phpt new file mode 100644 index 0000000..e3e2023 --- /dev/null +++ b/tests/ToArrayJsonSerializableTraitTest.phpt @@ -0,0 +1,31 @@ + 'Testovací 123', + 'town' => 'Želeč', + 'zip_code' => '391 74', + 'country' => 'CZ', +]; + +$normalizedData = [ + 'street_and_number' => 'Testovací 123', + 'town' => 'Želeč', + 'zip_code' => '39174', + 'country' => 'CZ', +]; + +$address = Address::from($data); + +Assert::equal( + $normalizedData, + \json_decode((string) \json_encode($address), true) +); diff --git a/tests/UrlTypeTest.phpt b/tests/UrlTypeTest.phpt index b63a199..ef05e45 100644 --- a/tests/UrlTypeTest.phpt +++ b/tests/UrlTypeTest.phpt @@ -150,6 +150,20 @@ final class UrlTypeTest extends TestCase ); } + public function testClone(): void + { + Assert::noError( + static function () { + $value = 'https://marketadanisova.cz/wp-content/uploads/2018/09/Snímek-obrazovky-2018-09-18-v-21.21.41.png'; + $url = UrlType::from($value); + + $dolly = clone $url; + + Assert::true($dolly->getValue() === $url->getValue()); + } + ); + } + } (new UrlTypeTest())->run(); From 6a59b17701324e786587ef5cc14c5c70cf407c4e Mon Sep 17 00:00:00 2001 From: Martin Strouhal Date: Sun, 17 Sep 2023 15:17:21 +0200 Subject: [PATCH 2/2] JsonSerializable Interface implemented for all relevant types --- tests/UrlTypeTest.phpt | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/tests/UrlTypeTest.phpt b/tests/UrlTypeTest.phpt index ef05e45..b63a199 100644 --- a/tests/UrlTypeTest.phpt +++ b/tests/UrlTypeTest.phpt @@ -150,20 +150,6 @@ final class UrlTypeTest extends TestCase ); } - public function testClone(): void - { - Assert::noError( - static function () { - $value = 'https://marketadanisova.cz/wp-content/uploads/2018/09/Snímek-obrazovky-2018-09-18-v-21.21.41.png'; - $url = UrlType::from($value); - - $dolly = clone $url; - - Assert::true($dolly->getValue() === $url->getValue()); - } - ); - } - } (new UrlTypeTest())->run();