Last active
February 19, 2018 03:45
-
-
Save natebrunette/8c4d175d6001a8ed2b71746051bac91a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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()); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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