<?php
/*
* This file is part of Chevere.
*
* (c) Rodolfo Berrios <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Chevere\VarDump\Processors;
use Chevere\Parameter\Interfaces\TypeInterface;
use Chevere\VarDump\Interfaces\ProcessorInterface;
use Chevere\VarDump\Interfaces\ProcessorNestedInterface;
use Chevere\VarDump\Interfaces\VarDumperInterface;
use Chevere\VarDump\Processors\Traits\HandleDepthTrait;
use Chevere\VarDump\Processors\Traits\ProcessorTrait;
final class ArrayProcessor implements ProcessorInterface, ProcessorNestedInterface
{
use ProcessorTrait;
use HandleDepthTrait;
/**
* @var array<mixed>
*/
private array $var;
private int $count = 0;
public function __construct(
private VarDumperInterface $varDumper
) {
$this->assertType();
/** @var array<mixed> $array */
$array = $this->varDumper->dumpable()->var();
$this->var = $array;
$this->depth = $this->varDumper->depth() + 1;
$this->count = count($this->var);
$this->info = 'size=' . $this->count;
}
public function type(): string
{
return TypeInterface::ARRAY;
}
public function write(): void
{
$this->varDumper->writer()->write(
$this->typeHighlighted()
. ' '
. ($this->count === 0 ? '[] ' : '')
. $this->highlightParentheses($this->info)
);
if ($this->isCircularRef($this->var)) {
$this->varDumper->writer()->write(
' '
. $this->highlightParentheses($this->circularReference())
);
return;
}
if ($this->depth > self::MAX_DEPTH) {
$this->varDumper->writer()->write(
' '
. $this->highlightParentheses($this->maxDepthReached())
);
return;
}
$this->processMembers();
}
/**
* @param array<mixed> $array
*/
private function isCircularRef(array $array): bool
{
foreach ($array as $var) {
if ($array === $var) {
return true;
}
if (is_array($var)) {
return $this->isCircularRef($var);
}
}
return false;
}
private function processMembers(): void
{
$aux = 0;
$operator = $this->highlightOperator('=>');
foreach ($this->var as $key => $value) {
$aux++;
if ($aux === 1) {
$this->varDumper->writer()->write(
$this->varDumper->format()->detailsOpen(
$this->varDumper->depth() === 0
)
);
if ($this->varDumper->format()->detailsClose() === '') {
$this->varDumper->writer()->write("\n");
}
} else {
$this->varDumper->writer()->write("\n");
}
$indentString = $this->varDumper->indentString();
$format = $this->varDumper->format()->filterEncodedChars((string) $key);
$this->varDumper->writer()->write(" {$indentString}{$format} {$operator} ");
$this->handleDepth($value);
}
if ($aux > 0) {
$this->varDumper->writer()->write(
$this->varDumper->format()->detailsClose()
);
}
}
}
|