From 2d0d8bac8699b7e15ce0ea465dbf19aebf953886 Mon Sep 17 00:00:00 2001 From: Maarten Bruna <14947039+ictbeheer@users.noreply.github.com> Date: Tue, 17 Mar 2026 13:30:05 +0100 Subject: [PATCH 1/4] feat: allow Carbon as meta type --- src/Traits/HasMeta.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Traits/HasMeta.php b/src/Traits/HasMeta.php index a53591c..59853ed 100644 --- a/src/Traits/HasMeta.php +++ b/src/Traits/HasMeta.php @@ -4,6 +4,7 @@ namespace Yard\Data\Traits; +use Carbon\CarbonImmutable; use Spatie\LaravelData\Data; use Yard\Data\Attributes\Meta; use Yard\Data\Attributes\MetaPrefix; @@ -31,7 +32,14 @@ private function loadMeta(): void $metaValue = $propertyTypeName::from($metaValue); } elseif (is_a($propertyTypeName, \BackedEnum::class, true) && (is_int($metaValue) || is_string($metaValue))) { $metaValue = $propertyTypeName::from($metaValue); + } elseif (is_a($propertyTypeName, CarbonImmutable::class, true) && is_string($metaValue)) { + if (CarbonImmutable::canBeCreatedFromFormat($metaValue,'Ymd')) { + $metaValue = CarbonImmutable::createFromFormat('Ymd', $metaValue); + } elseif (CarbonImmutable::canBeCreatedFromFormat($metaValue,'Y-m-d H:i:s')) { + $metaValue = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $metaValue); + } } + $property->setValue($this, $metaValue); } } From ea41e0fb8f4c0eddce5e84d4ba8a315b6be4a2dc Mon Sep 17 00:00:00 2001 From: Yard workflows Date: Tue, 17 Mar 2026 12:32:50 +0000 Subject: [PATCH 2/4] style: apply php-cs-fixer changes --- src/Traits/HasMeta.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Traits/HasMeta.php b/src/Traits/HasMeta.php index 59853ed..88027c1 100644 --- a/src/Traits/HasMeta.php +++ b/src/Traits/HasMeta.php @@ -33,9 +33,9 @@ private function loadMeta(): void } elseif (is_a($propertyTypeName, \BackedEnum::class, true) && (is_int($metaValue) || is_string($metaValue))) { $metaValue = $propertyTypeName::from($metaValue); } elseif (is_a($propertyTypeName, CarbonImmutable::class, true) && is_string($metaValue)) { - if (CarbonImmutable::canBeCreatedFromFormat($metaValue,'Ymd')) { + if (CarbonImmutable::canBeCreatedFromFormat($metaValue, 'Ymd')) { $metaValue = CarbonImmutable::createFromFormat('Ymd', $metaValue); - } elseif (CarbonImmutable::canBeCreatedFromFormat($metaValue,'Y-m-d H:i:s')) { + } elseif (CarbonImmutable::canBeCreatedFromFormat($metaValue, 'Y-m-d H:i:s')) { $metaValue = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $metaValue); } } From f7f7fedb0e56cf426a81f18a9a1eaba86282661e Mon Sep 17 00:00:00 2001 From: Maarten Bruna <14947039+ictbeheer@users.noreply.github.com> Date: Tue, 17 Mar 2026 13:55:12 +0100 Subject: [PATCH 3/4] fix: missing fallback --- src/Traits/HasMeta.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Traits/HasMeta.php b/src/Traits/HasMeta.php index 88027c1..093fe8a 100644 --- a/src/Traits/HasMeta.php +++ b/src/Traits/HasMeta.php @@ -37,6 +37,8 @@ private function loadMeta(): void $metaValue = CarbonImmutable::createFromFormat('Ymd', $metaValue); } elseif (CarbonImmutable::canBeCreatedFromFormat($metaValue, 'Y-m-d H:i:s')) { $metaValue = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $metaValue); + } else { + $metaValue = CarbonImmutable::parse($metaValue); } } From 02184634742922f57f154003e975ce440f065f95 Mon Sep 17 00:00:00 2001 From: Maarten Bruna <14947039+ictbeheer@users.noreply.github.com> Date: Tue, 17 Mar 2026 15:09:18 +0100 Subject: [PATCH 4/4] fix: unnest logic --- src/Traits/HasMeta.php | 44 +++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/Traits/HasMeta.php b/src/Traits/HasMeta.php index 093fe8a..15e161f 100644 --- a/src/Traits/HasMeta.php +++ b/src/Traits/HasMeta.php @@ -27,25 +27,37 @@ private function loadMeta(): void foreach ($metaAttributes as $metaAttribute) { $meta = $metaAttribute->newInstance(); $metaValue = $meta->getValue($this->objectID(), $property->name, $this->metaPrefix()); - if (null !== $metaValue && null !== $propertyTypeName) { - if (is_a($propertyTypeName, Data::class, true)) { - $metaValue = $propertyTypeName::from($metaValue); - } elseif (is_a($propertyTypeName, \BackedEnum::class, true) && (is_int($metaValue) || is_string($metaValue))) { - $metaValue = $propertyTypeName::from($metaValue); - } elseif (is_a($propertyTypeName, CarbonImmutable::class, true) && is_string($metaValue)) { - if (CarbonImmutable::canBeCreatedFromFormat($metaValue, 'Ymd')) { - $metaValue = CarbonImmutable::createFromFormat('Ymd', $metaValue); - } elseif (CarbonImmutable::canBeCreatedFromFormat($metaValue, 'Y-m-d H:i:s')) { - $metaValue = CarbonImmutable::createFromFormat('Y-m-d H:i:s', $metaValue); - } else { - $metaValue = CarbonImmutable::parse($metaValue); - } - } - - $property->setValue($this, $metaValue); + if (null === $metaValue || null === $propertyTypeName) { + continue; } + $metaValue = $this->castValue($metaValue, $propertyTypeName); + $property->setValue($this, $metaValue); + } + } + } + + private function castValue(mixed $value, string $type): mixed + { + if (is_a($type, Data::class, true)) { + return $type::from($value); + } + + if (is_a($type, \BackedEnum::class, true) && (is_int($value) || is_string($value))) { + return $type::from($value); + } + + if (is_a($type, CarbonImmutable::class, true) && is_string($value)) { + if (CarbonImmutable::canBeCreatedFromFormat($value, 'Ymd')) { + return CarbonImmutable::createFromFormat('Ymd', $value); + } + if (CarbonImmutable::canBeCreatedFromFormat($value, 'Y-m-d H:i:s')) { + return CarbonImmutable::createFromFormat('Y-m-d H:i:s', $value); + } else { + return CarbonImmutable::parse($value); } } + + return $value; } private function metaPrefix(): string