<?php
/*
* Author: Dominik Piekarski <code@dompie.de>
* Created at: 2022/07/27 12:49
*/
declare(strict_types=1);
namespace App\StructSerializer\Main;
use App\StructSerializer\AbstractStruct;
use Frivol\Common\JSON;
class StructSerializer
{
private array $services = [];
public function toArray(StructOptions $options, object $entity): ?array
{
$classParts = explode('\\', get_class($entity));
$structSerializerClass = 'App\\StructSerializer\\'.array_pop($classParts).'Struct';
AbstractStruct::setServices($this->services);
return $structSerializerClass::toArray($options, $entity);
}
public function multipleToArray(StructOptions $options, iterable $entities): array
{
if ([] === $entities) {
return [];
}
$elements = [];
foreach ($entities as $entity) {
$elements[] = $this->toArray($options, $entity);
}
return $elements;
}
/**
* @throws \JsonException
*/
public function serialize(StructOptions $options, object $entity): string
{
return JSON::encode($this->toArray($options, $entity));
}
public function serializeArray(array $data): string
{
return JSON::encode($data);
}
/**
* @return $this
*/
public function addService(object $service): self
{
$this->services[get_class($service)] = $service;
return $this;
}
protected function getService(string $class): ?object
{
return $this->services[$class] ?? null;
}
}