Skip to content

Commit

Permalink
Implement asArray and asObject
Browse files Browse the repository at this point in the history
  • Loading branch information
g105b committed Jan 17, 2021
1 parent 682afbd commit 8261851
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 7 deletions.
32 changes: 25 additions & 7 deletions src/DataObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use JsonSerializable;

class DataObject implements JsonSerializable, TypeSafeGetter {
/** @var mixed[] */
private array $data;

public function __construct() {
Expand Down Expand Up @@ -53,12 +54,29 @@ public function jsonSerialize():mixed {
return $this->asArray();
}

public function asArray(bool $nested = true):array {
/** @return mixed[] */
public function asArray():array {
$array = $this->data;

array_walk_recursive($array, function(&$item):void {
if($item instanceof static) {
$item = $item->asArray();
}
});

return $array;
}

public function asObject(bool $nested = true):object {
return (object)$this->asArray($nested);
public function asObject():object {
$array = $this->data;

array_walk_recursive($array, function(&$item):void {
if($item instanceof static) {
$item = $item->asObject();
}
});

return (object)$array;
}

private function getAsType(
Expand Down Expand Up @@ -105,10 +123,10 @@ private function getAsDateTimeInterface(mixed $value):DateTimeInterface {
$microsecond = ($value - $timestamp) * 1_000_000;
$dateTime = $dateTime->setTimestamp($timestamp);
$dateTime = $dateTime->setTime(
$dateTime->format("H"),
$dateTime->format("i"),
$dateTime->format("s"),
round($microsecond)
(int)$dateTime->format("H"),
(int)$dateTime->format("i"),
(int)$dateTime->format("s"),
(int)round($microsecond)
);
}
else {
Expand Down
55 changes: 55 additions & 0 deletions test/phpunit/DataObjectTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -192,4 +192,59 @@ public function getDateTimeFromString() {
$sut->getDateTime("birthday")->format("jS M Y H:i:s")
);
}

public function testAsArray() {
$doubleNested = (new DataObject())
->with("leaf-key-1", "leaf-value-1")
->with("leaf-key-2", "leaf-value-2");

$nested = (new DataObject())
->with("score", 77.4)
->with("code", "AAA")
->with("nested-data", $doubleNested);

$sut = (new DataObject())
->with("name", "example")
->with("id", 123)
->with("data", $nested);

$array = $sut->asArray();
self::assertArrayHasKey("id", $array);
self::assertArrayHasKey("name", $array);
self::assertArrayHasKey("data", $array);

self::assertIsArray($array["data"]);
self::assertArrayHasKey("score", $array["data"]);
self::assertArrayHasKey("code", $array["data"]);

self::assertIsArray($array["data"]["nested-data"]);
self::assertArrayHasKey("leaf-key-1", $array["data"]["nested-data"]);
self::assertArrayHasKey("leaf-key-2", $array["data"]["nested-data"]);
}

public function testAsObject() {
$doubleNested = (new DataObject())
->with("leafKey1", "leaf-value-1")
->with("leafKey2", "leaf-value-2");

$nested = (new DataObject())
->with("score", 77.4)
->with("code", "AAA")
->with("nestedData", $doubleNested);

$sut = (new DataObject())
->with("name", "example")
->with("id", 123)
->with("data", $nested);

$object = $sut->asObject();
self::assertEquals(123, $object->id);
self::assertEquals("example", $object->name);
self::assertIsObject($object->data);
self::assertEquals(77.4, $object->data->score);
self::assertEquals("AAA", $object->data->code);
self::assertIsObject($object->data->nestedData);
self::assertEquals("leaf-value-1", $object->data->nestedData->leafKey1);
self::assertEquals("leaf-value-2", $object->data->nestedData->leafKey2);
}
}

0 comments on commit 8261851

Please sign in to comment.