ldc-legaulois/app/Lib/Definitions/MenuNode.php
2024-10-08 11:57:56 +02:00

73 lines
2.2 KiB
PHP

<?php
namespace App\Lib\Definitions;
use App\Enums\Settings\MenuNodeType;
use App\Lib\Link;
/**
* @property-read \App\Enums\Settings\MenuNodeType $type The node menu type.
* @property-read string $title The node menu title.
* @property-read \App\Lib\Link $link The node menu link.
* @property-read boolean $published The node menu publish status.
* @package App\Lib\Definitions
*/
class MenuNode extends \stdClass
{
/**
* Get property.
*
* @param string $name
* @return mixed
* @throws \TypeError If prop is undefined.
*/
public function __get(string $name): mixed
{
if (in_array($name, ['type', 'title', 'link', 'published'])) {
return $this->{$name};
}
throw new \TypeError("undefined property {$name}");
}
/**
* Make and instance
*
* @param integer $type The node menu type.
* @param boolean $published The node menu published.
* @param string $title The node menu title.
* @param array $link The node menu link.
* @return \App\Lib\Definitions\MenuNode
* @throws \RuntimeException If $type or $data is wrong.
*/
public static function make(int $type, bool $published, string $title, array $link): self
{
self::assertTypeIsCorrect($type);
$menuNode = new self();
// @phpstan-ignore-next-line
$menuNode->type = MenuNodeType::make($type);
// @phpstan-ignore-next-line
$menuNode->published = $published;
// @phpstan-ignore-next-line
$menuNode->title = $title;
// @phpstan-ignore-next-line
$menuNode->link = new Link(...$link);
return $menuNode;
}
/**
* Assert Type is correct
*
* @param integer $type
* @return void
* @throws \RuntimeException If $type is wrong.
*/
public static function assertTypeIsCorrect(int $type): void
{
try {
$type = MenuNodeType::make($type);
} catch (\BadMethodCallException $e) {
throw new \RuntimeException($e->getMessage());
}
}
}