diff --git a/src/PrepareRejectBucket.php b/src/PrepareRejectBucket.php index b465091..ff7c25c 100644 --- a/src/PrepareRejectBucket.php +++ b/src/PrepareRejectBucket.php @@ -4,6 +4,7 @@ use Kiboko\Component\ExpressionLanguage\Magento\Serializable\ProductCatalogSerializableRejectData; use Kiboko\Component\ExpressionLanguage\Magento\Serializable\SerializableRejectDataInterface; +use ReflectionObject; use Symfony\Component\ExpressionLanguage\ExpressionFunction; class PrepareRejectBucket extends ExpressionFunction @@ -17,15 +18,45 @@ public function __construct($name) ); } - private function compile(string $dataToFormat): string + private function compile(string $input, int $depth = 2): string { return <<getProperties() as \$property) { + \$value = \$property->getValue(\$input); + \$output[] = \$serializer(\$value, \$depth - 1); + } + return \$output; + }; + return \$serializer($input, $depth) + })() PHP; } - private function evaluate(array $context, array $dataToFormat): SerializableRejectDataInterface + private function evaluate(array $context, mixed $input, int $depth = 2): array { - return new ProductCatalogSerializableRejectData($dataToFormat); + $serializer = function($input, int $depth = 2) use (&$serializer) { + if ($depth === 0 || !is_object($input)) { + return json_encode($input); + } + + $output = []; + $object = new ReflectionObject($input); + + foreach ($object->getProperties() as $property) { + $value = $property->getValue($input); + $output[] = $serializer($value, $depth - 1); + } + + return $output; + }; + + return $serializer($input, $depth); } }