Skip to content

Instantly share code, notes, and snippets.

@natebrunette
Last active February 19, 2018 03:45
Show Gist options
  • Save natebrunette/8c4d175d6001a8ed2b71746051bac91a to your computer and use it in GitHub Desktop.
Save natebrunette/8c4d175d6001a8ed2b71746051bac91a to your computer and use it in GitHub Desktop.
<?php
namespace App;
use Doctrine\Common\Collections\ArrayCollection;
use Tebru\Gson\Internal\TypeAdapter\ArrayTypeAdapter;
use Tebru\Gson\JsonReadable;
use Tebru\Gson\JsonToken;
use Tebru\Gson\JsonWritable;
use Tebru\Gson\TypeAdapter;
class ArrayCollectionTypeAdapter extends TypeAdapter
{
/**
* @var ArrayTypeAdapter
*/
private $arrayTypeAdapter;
/**
* Constructor
*
* @param ArrayTypeAdapter $arrayTypeAdapter
*/
public function __construct(ArrayTypeAdapter $arrayTypeAdapter)
{
$this->arrayTypeAdapter = $arrayTypeAdapter;
}
/**
* Read the next value, convert it to its type and return it
*
* @param JsonReadable $reader
* @return ArrayCollection
*/
public function read(JsonReadable $reader): ArrayCollection
{
if ($reader->peek() === JsonToken::NULL) {
return $reader->nextNull();
}
return new ArrayCollection($this->arrayTypeAdapter->read($reader));
}
/**
* Write the value to the writer for the type
*
* @param JsonWritable $writer
* @param ArrayCollection $value
* @return void
*/
public function write(JsonWritable $writer, $value): void
{
if (null === $value) {
$writer->writeNull();
return;
}
$this->arrayTypeAdapter->write($writer, $value->toArray());
}
}
<?php
namespace App;
use Tebru\Gson\Internal\TypeAdapter\ArrayTypeAdapter;
use Tebru\Gson\Internal\TypeAdapterProvider;
use Tebru\Gson\TypeAdapter;
use Tebru\Gson\TypeAdapterFactory;
use Tebru\PhpType\TypeToken;
class ArrayCollectionTypeAdapterFactory implements TypeAdapterFactory
{
/**
* Will be called before ::create() is called. The current type will be passed
* in. Return false if ::create() should not be called.
*
* @param TypeToken $type
* @return bool
*/
public function supports(TypeToken $type): bool
{
if (!$type->isObject()) {
return false;
}
if (count($type->getGenerics()) > 2) {
return false;
}
return $type->isA('ArrayCollection');
}
/**
* Accepts the current type and a [@see TypeAdapterProvider] in case another type adapter needs
* to be fetched during creation. Should return a new instance of the TypeAdapter.
*
* @param TypeToken $type
* @param TypeAdapterProvider $typeAdapterProvider
* @return TypeAdapter
*/
public function create(TypeToken $type, TypeAdapterProvider $typeAdapterProvider): TypeAdapter
{
$generics = array_map(function (TypeToken $type) {
return (string)$type;
}, $type->getGenerics());
$genericString = implode(',', $generics);
if ($genericString !== '') {
$genericString = '<'.$genericString.'>';
}
return new ArrayCollectionTypeAdapter(
new ArrayTypeAdapter(new TypeToken($type->getRawType().$genericString), $typeAdapterProvider)
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment